缓冲区溢出实例

2015-10-29  本文已影响623人  loveforkeeps

源码如下:

#include <stdio.h>
#include <windows.h>
#define PASSWORD "1234567"
int verify (char * password)
{
int flag;
char buffer[44];
flag = strcmp(password,PASSWORD);
strcpy(buffer,password);
return flag;
}
void main()
{   
int vaild_flag=0;
char password[1024];
FILE * fp;
LoadLibrary("user32.dll");
if (!(fp=fopen("password.txt","rw+")))
{
    exit(0);        
}
fscanf(fp,"%s",password);
vaild_flag = verify(password);
if (vaild_flag)
{
    printf("Incorrect!!!!!!\n");
}
else
{
    printf("Congratulation!Gay!you have passed!!!!!\n");
}
fclose(fp);
getchar();
} 

因为在程序输入中手动输入shellcode较为困难。所以我们用password.txt作为输入源,shellcode也将写入其中。

buffer[0…3]
……
buffer[40…43]
flag
EBP
返回地址

未受溢出的flag 受溢出影响的flag 用44个字符填充buffer shellcode成功执行

shellcode的编写

用汇编语言编写之后(可用高级语言通过编译器查看)

用所用机器的CPU指令集,将其写为16进制代码。Shellcode便制作成功了。

此处的shellcode是调用系统的动态链接库中的messageboxA.dll

将地址写入

用APIAdress.exe可以查看API所在的入口地址。

上一篇 下一篇

猜你喜欢

热点阅读