【问题标题】:Buffer Overflow - Printing host/user-name缓冲区溢出 - 打印主机/用户名
【发布时间】:2018-12-11 08:11:26
【问题描述】:

我正在尝试对一个简单的 C 程序执行缓冲区溢出攻击,以了解它的工作原理。到目前为止,我有一个 python 脚本,它有一堆 \x90s 和指向一个地址槽的返回地址,该地址槽包含 NOP 雪橇的一部分。我有打印主机名的代码,但它不是我写的,我不理解代码本身。

我有一个想法,我可以编写一个 C 程序,它使用 uname -a 打印主机名,我可以将其反汇编成程序集,然后将其转换为十六进制,但这给了我很多的程序集代码。这将使我对实际发生的事情有更多的了解,但就输出而言,感觉就像我做错了什么。

我将如何创建/生成执行此操作的 shell 代码,打印我的主机名?我正在使用 Kali Linux 32 位系统。

【问题讨论】:

  • 你知道'hostname' linux命令吗?

标签: buffer-overflow shellcode


【解决方案1】:

您不必编写完整的 C 程序然后将其反汇编。

您可以编写一个只执行您想要的操作的简单 C 函数,然后让 GCC 编译但使用-S 参数组装和链接它。

您也可以打开调试标志-g,这样程序集就会有一些调试数据,这样更容易阅读。

获取此示例代码:

#include <unistd.h>

void get_hostname() {
    char buffer[100];
    gethostname(buffer, 100);
}

如果这是一个完整的hn.c文件内容,可以使用以下命令生成hn.asm文件:

gcc -S -g hn.c -o hn.asm

这个文件仍然会有一堆你不需要的东西,但它也会有一个容易找到和清晰的你想要的功能的组合:

.Ltext0:
    .globl  get_hostname
    .type   get_hostname, @function
get_hostname:
.LFB0:
    .file 1 "hn.c"
    .loc 1 3 0
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $112, %rsp
    .loc 1 3 0
    movq    %fs:40, %rax
    movq    %rax, -8(%rbp)
    xorl    %eax, %eax
    .loc 1 5 0
    leaq    -112(%rbp), %rax
    movl    $100, %esi
    movq    %rax, %rdi
    call    gethostname
    .loc 1 6 0
    movq    -8(%rbp), %rax
    xorq    %fs:40, %rax
    je  .L2
    call    __stack_chk_fail
.L2:
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

您可以将其传递给汇编程序以生成您想要的机器代码。

注意.loc 指令:它们用于将汇编代码与原始C 代码的行号相匹配。您可以像调试器一样使用它们来了解哪些汇编行代表哪一行 C 代码。

【讨论】:

    【解决方案2】:

    您可以只使用一个简单的 /bin/sh shellcode 并运行您想要的任何命令。 这是一个简单的shellcode。 如果您仍然只需要该命令,您可以更改您在 shellcode 中推送的命令字符串(uname -a 而不是 /bin/sh)。

    【讨论】:

      【解决方案3】:

      这里是我为x86机器写的shellcode。

      Shellcode/bin/hostname

      "\x31\xc0\x50\x6a\x65\x68\x74\x6e\x61\x6d\x68\x2f\x68\x6f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80\x31\xc0\x50\x89\xe3\xb0\x01\xcd\x80"
      

      组装:

      global _start
      section .text
      
      _start:
      
      xor     eax, eax  
      push    eax
      push    byte 0x65
      push    dword 0x6d616e74
      push    dword 0x736f682f
      push    dword 0x6e69622f
      mov     ebx, esp
      push    eax
      push    ebx
      mov     ecx, esp
      mov     al, 0xb
      int     0x80
      
      xor     eax, eax
      push    eax
      mov     ebx, esp
      mov     al, 0x1
      int     0x80
      

      【讨论】:

        猜你喜欢
        • 2018-02-14
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        相关资源
        最近更新 更多