【问题标题】:Difficulties injecting shellcode with buffer overflow注入带有缓冲区溢出的 shellcode 的困难
【发布时间】: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 中尝试了几个地址,从中间的地址到靠近每个边缘的地址。我一直遇到同样的问题,并且在分段错误中不断出现相同的地址。

标签: buffer-overflow shellcode


【解决方案1】:

bash 和 sh 是两个不同的 shell。基本上 bash 是 sh,具有更多功能和更好的语法。大多数命令的工作方式相同,但它们不同。

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

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

【讨论】:

  • 我用原来的shellode(带sh的那个)试过了,我遇到了同样的问题。我正在使用 32 位 Arch Linux;我不知道 Arch 在 sh 方面的行为是否与其他发行版相同。
【解决方案2】:

你的 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

您的esp 指向shellcode 的末尾。在第一个 push 之后,esp 指向你的 shellcode 的最后 4 个字节。随着 shellcode 继续执行,随后向堆栈的推送实际上会覆盖 shellcode 的某些部分。我建议你在 shellcode 的开头添加一些代码,这样你的 esp 就离 shellcode 有点远。 add esp,0x7f 不包含任何空字节,适合 3 个字节 "83c470"

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多