我是个菜鸟,这个问题弄了一天也没搞明白,希望知道的耽误2分钟帮我看一下,谢谢了。
问题是在书上4.4节的代码植入,通过覆盖返回值,弹出一个MessageBox.
环境 WIN7旗舰版 + VC6.0 默认编译 DEBUG
里面的插入代码
改了2处, 一处我改成本机的MessageBox内存入口地址 AE FE CB 7D
还有一处 就是最后的覆盖返回地址 返回到数组的起始位置 B8 FA 18 00 .
传不了图,但是我在OLLDBG里面调试的时候,EIP 确实跳到了 0018FAB8 执行了的,每句代码都执行完成.
CPU Disasm
Address Hex dump Command Comments
0018FAB8 33DB XOR EBX,EBX
0018FABA 53 PUSH EBX
0018FABB 68 77657374 PUSH 74736577
0018FAC0 68 6661696C PUSH 6C696166
0018FAC5 8BC4 MOV EAX,ESP
0018FAC7 53 PUSH EBX
0018FAC8 50 PUSH EAX
0018FAC9 50 PUSH EAX
0018FACA 53 PUSH EBX
0018FACB B8 AEFECB7D MOV EAX,7DCBFEAE
0018FAD0 FFD0 CALL EAX
0018FAD2 90 NOP
但是它就是不给跳出一个MessageBox.
虚拟机(WINXP SP2 VC6.0)测试就更奇怪了 ,我把本机的password.txt复制进去,运行,崩溃(应该覆盖了返回地址),然后改前面说的2处地方, 改掉之后,我去OLLDBG看,他就把前面19个字节保存进去了,也就是 B8 AE FE CB 7D FF D0 前面的那些...............根本就没有覆盖到返回地址..我如果又新建一个文本,例如输入0000000000000000000000000000000000000000000000000000000 他又是会崩溃的...我感觉我晕了......
字比较多,说得也比较乱,大家见谅,有知道的一定跟我说下。
还是把C++代码贴上:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int temp;
char buffer[44];
temp=strcmp(password,PASSWORD);
strcpy(buffer,password); // 覆盖掉他
return temp;
}
int main()
{
int flag=0;
char password[1024];
FILE *fp;
LoadLibrary("user32.dll");
if (!(fp=fopen("password.txt","rw+")))
{
printf("open file error");
exit(0);
}
fscanf(fp,"%s",password);
flag=verify_password(password);
if (flag)
{
printf("%s is error\n",password);
}
else
{
printf("%s is OK\n",password);
// MessageBoxA(NULL,"A","B",NULL);
}
fclose(fp);
getch();
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)