【问题标题】:Convert a Compiled C Program to shellcode (Hex)将已编译的 C 程序转换为 shellcode(十六进制)
【发布时间】:2021-08-05 23:03:28
【问题描述】:

所以我想把一个编译好的 C 程序转换成 Hex 格式,这样我就可以把它注入到内存中。我目前面临的问题是我不知道如何将编译的 C 文件转换为十六进制。谁能告诉我它是怎么做的?

我的 C 代码 (temp.c):

#include <stdio.h>

void main(){
printf("Working!");
}

使用 gcc 编译: gcc -g temp.c -o temp -m32

【问题讨论】:

  • 您可以为此使用objcopy 实用程序。但请记住,仅将 C 程序注入内存对于 shellcode 目的并不是特别有用。 Shellcode 通常需要根据环境要求专门编写才能有用。 C 编译器无法做到这一点。您必须在汇编中编写它并学习如何做到这一点。
  • 你不会知道printf在目标进程的虚拟地址空间中的位置,无论是绝对地址还是相对距离,所以没有实用的方法来调用它。您需要内联系统调用。同样,您要使用的内存中的任何数据(例如"Working!")都需要与您的代码连续或在堆栈上构造,而不是在.rodata 中。

标签: c assembly gcc shellcode


【解决方案1】:

您可以使用write(); syscall 和exit(); syscall 编写程序集。

这是我写的代码,文件w.asm

global _start
section .text

_start:

    push    byte  0x0a    
    push    dword "ing!"
    push    dword "Work"
    inc     ebx
    mov     ecx, esp
    mov     dl, 9
    mov     al, 4
    int     0x80

    xor     ebx, ebx
    mov     al, 1
    int     0x80

使用nasmld 组装和链接:

nasm -f elf w.asm && ld -o w w.o

使用 objdump one-liner 将二进制文件转储为十六进制(shellcode 样式),如下所示:

objdump -d ./w | grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g' 

你会得到这样的结果:

"\x6a\x0a\x68\x69\x6e\x67\x21\x68\x57\x6f\x72\x6b\x43\x89\xe1\xb2\x09\xb0\x04\xcd\x80\x31\xdb\xb0\x01\xcd\x80"

【讨论】:

  • 你的 shellcode 不能像真正的 shellcode 那样工作,只有在_start 中:你依赖于 EAX 的高字节为零,而 EBX 正好为零。这在 Linux 进程启动时是正确的(因此在静态可执行文件中为 _start),但如果您将此代码注入缓冲区溢出,则不会是正确的。一种方法是xor ebx,ebx/lea eax, [ebx+4]/lea edx, [ebx+9]/inc ebx。 (EDX 太高是可以的,如果你不介意在你的字符串之后写垃圾,直到写系统调用遇到一个未映射的页面。)
  • 另外,如果您要使用 NASM,您可以使用 BITS 32 并将其组装成一个平面二进制文件,您可以进行 hexdump。
  • 另外,这并不能真正回答问题。我认为将 asm 转换为 shellcode 的技术是众所周知的(尽管如果不是,这可能是另一个问题的答案)。我认为这个问题的重点是让不知道或不理解 asm 的人使用编译器而不是手动编写,因为编译器没有选项来制作对 shellcode 友好的 asm,所以这是行不通的。即使使用 inline-asm 宏进行系统调用,编译器通常仍将 .rodata 用于字符串,并且不会避免使用 0 字节。 (虽然可能会出现 clang -Oz。)
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 2017-07-31
  • 2013-07-20
  • 2012-06-17
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多