日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

缓冲区溢出基本C程序的控制台和Win32版本

發布時間:2025/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 缓冲区溢出基本C程序的控制台和Win32版本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <stdio.h> #include <string.h>int main(void) {char buff[8] = {0};char *p = "012345678912345";strcpy(buff,p);printf("%s\n",buff);return 0; }

這是緩沖區溢出原理演示的基本C程序;

p所指向的字符串長度大于buff的長度,拷貝時發生緩沖區溢出;程序崩潰;

?

如果p指向字符串的長度不超過,就不會溢出;

?

對于Win32來說,使用Windows提供的Win32字符串函數,字符串拷貝使用lstrcpy;

#include <stdio.h> #include <windows.h>int main(void) {char buff[8] = {0};char *p = "0123456789";lstrcpy(buff,p);printf("%s\n",buff);return 0; }

一樣的,長度超過,運行程序,崩潰;

?

如果使用安全版的字符串拷貝函數,strncpy(buff,p,sizeof(buff));

就不會溢出;

?

下面來作一個Win32窗口版本溢出程序;單擊鼠標左鍵執行拷貝并輸出;

/* buffer over demo,by bobo,2020-01-19 */#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) {static TCHAR szAppName[] = TEXT ("buffer over demo") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName = szAppName ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName,TEXT ("buffer over demo"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL, hInstance,NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ; }LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {HDC hdc ;PAINTSTRUCT ps ;char buff[8] = {0};char *p = "012345678912345";switch (message){case WM_CREATE:return 0 ;case WM_LBUTTONDOWN :hdc = GetDC(hwnd); lstrcpy(buff,p);TextOut(hdc, 100, 100, buff, 15);return 0;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ; }

buff長度8,p指向內容長度15;

按理程序應該崩潰;但是Win32窗口程序真的沒崩潰;還輸出了15個長度的字符串;

啥情況?

以上是Win10,VC++6;

?

此程序僅演示緩沖區溢出最基本原理;

如果真能干這事的人,其目的并不是引起程序崩潰,而是通過覆蓋程序返回地址等手段,改變程序的執行流程;

?

總結

以上是生活随笔為你收集整理的缓冲区溢出基本C程序的控制台和Win32版本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。