使用缓冲区溢出注入shellcode的困难

时间:2017-12-14 02:44:39

标签: buffer-overflow shellcode

对于我正在进行的任务,我必须注入shellcode以执行execve(/ bin / bash)到以下C程序中:

#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,并用\ x2f \ x62 \ x61 \ x73替换了\ x2f \ x2f \ x73 \ x68,这是for,用于bash。我关闭了ASLR,用gcc编译了fin​​al1.c,选项为-m32,-zexecstack和-fno-stack-protector。以下是测试有效负载,以查看是否可以覆盖返回地址:enter image description here 19个nops后面是我的23字节shellcode并且四个字符串,使有效载荷为46个字节。

当我在gdb中使用/ tmp / input运行final1时,我可以看到我可以覆盖返回地址。 enter image description here 突出显示的地址是溢出的缓冲区。由于分段错误中的四个61,我可以告诉我已经覆盖了返回地址。

这是我遇到困难的地方。我没有使用四个a来覆盖返回地址,而是在我的有效载荷中使用了nop sled中间某处的地址:我选择了地址0xbffff1ea。但是,当我使用有效负载运行final1时,我看到了这一点,而不是打开bash: enter image description here

分段错误中的数字不是第一次运行中有效负载的最后四个字节,因此我认为这意味着它会跳转。我还注意到显示的数字0xbffff105是shellcode中其中一个字节的地址,我以黄色突出显示。

此时我已撞墙了。有谁知道我为什么遇到这些麻烦?另外,如果我对自己所做的事情有所了解,我建议你纠正我。

2 个答案:

答案 0 :(得分:1)

bash和sh是两个不同的shell。基本上bash是sh,具有更多功能和更好的语法。大多数命令都是一样的,但它们是不同的。

话虽如此,你应该意识到/ bin / sh在大多数系统上将是一个符号链接,不会调用sh。在Ubuntu / bin / sh中用于链接bash,Linux发行版上的典型行为,但现在已经改为链接到另一个名为dash的shell。

因此,简而言之,我认为您不需要更改execve函数的十六进制部分。

答案 1 :(得分:0)

你的shellcode有一堆更改堆栈的指令。

   0:    31 c0                    xor    eax, eax
   2:    50                       push   eax
   3:    68 2f 62 61 73           push   0x7361622f
   8:    68 2f 62 69 6e           push   0x6e69622f
   d:    89 e3                    mov    ebx, esp
   f:    50                       push   eax
  10:    53                       push   ebx
  11:    89 e1                    mov    ecx, esp
  13:    b0 0b                    mov    al, 0xb
  15:    cd 80                    int    0x80

shellcode结束后的esp分。在第一个push之后,esp指向shellcode的最后4个字节。随着shellcode继续执行,后续推送到堆栈实际上会覆盖shellcode的某些部分。我建议你在shellcode的开头添加一些代码,以便你的esp指向一点远离shellcode。 add esp,0x7f不包含任何空字节,并且适合3个字节“83c470”