【发布时间】:2017-12-14 02:44:38
【问题描述】:
对于我正在做的作业,我必须将 shellcode 注入到以下 C 程序中来执行 execve(/bin/bash):
#include <stdio.h>
#include <string.h>
void return_input(void)
{
char array[30];
gets(array);
printf(array);
}
main()
{
return_input();
return 0;
}
我反汇编了return_input,发现缓冲区有38个字节大。我在http://shell-storm.org/shellcode/files/shellcode-827.php 找到了一个执行 execve(/bin/sh) 的 shellcode,并将用于 sh 的 \x2f\x2f\x73\x68 替换为用于 bash 的 \x2f\x62\x61\x73。我关闭了 ASLR,并使用带有选项 -m32、-zexecstack 和 -fno-stack-protector 的 gcc 编译了 final1.c。以下是一个测试有效载荷,看看我是否可以覆盖返回地址: 19 个 nops 后跟我的 23 字节 shellcode 和 4 个 a,使有效负载 46 个字节。
当我在 gdb 中使用 /tmp/input 运行 final1 时,我可以看到我可以覆盖返回地址。 突出显示的地址是溢出的缓冲区。由于分段错误错误中的四个 61,我可以说我已经覆盖了返回地址。
这是我遇到困难的地方。我没有让四个 a 覆盖返回地址,而是在我的有效负载中的 nop sled 中间某处使用了一个地址:我选择了地址0xbffff1ea。但是,当我使用有效负载运行 final1 时,我没有打开 bash,而是看到了这一点:
分段错误中的数字不是第一次运行时有效负载的最后四个字节,所以我认为这意味着它跳转了。我还注意到显示的数字,0xbffff105,是 shellcode 中字节之一的地址,我用黄色突出显示。
此时我已经碰壁了。有谁知道我为什么会遇到这些麻烦?另外,如果我对自己所做的事情的理解似乎有问题,我鼓励您纠正我。
【问题讨论】:
-
尝试选择其他middle_of_nop_sled地址,如果不行我会安装32bit vm :(,你可以上传二进制文件吗?
-
我正在使用 32 位 Arch Linux 机器的 vm。我在哪里可以找到二进制文件?
-
意思是crackme二进制..nvm..试过其他地址?
-
我刚刚在 nop sled 中尝试了几个地址,从中间的地址到靠近每个边缘的地址。我一直遇到同样的问题,并且在分段错误中不断出现相同的地址。