缓冲区溢出基本C程序的控制台和Win32版本
生活随笔
收集整理的這篇文章主要介紹了
缓冲区溢出基本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版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win32程序简单演示-模拟电子表格移动
- 下一篇: 记一次内核模块查看 - 初步通过文件厂商