用于组装 x86、x64 和 ARM 漏洞的 Python 库

逆向工程 拆卸 部件 Python
2021-07-01 09:35:59

拥有一个可以组装 x86、x64 和 ARM 指令的纯 Python 库将非常有用。你有什么建议吗?

我不介意它们是否不是纯 Python,但最好这样做。

3个回答

一些 Python 汇编程序库:

Pyasm - Python x86 汇编器

Pyasm 是一个全功能的动态汇编器,完全用 Python 编写。通过动态,它意味着可以在运行时在python中生成和执行机器代码,而不需要生成目标文件和链接。它本质上允许在 x86 平台上的 Python 模块中进行“内联”汇编。

pyasm2

一个简单而强大的 Python 汇编引擎。尽管它被称为 pyasm2,但这本身并不是 Pyasm 或 pyASM 的继承者。pyasm2 旨在尽可能灵活,它将支持 x86、SSE 和 SSE2。

d00ks

d00ks 是一个 ARM 汇编器和模拟器。

AsmJit-Python

AsmJit是 C++ 语言的完整 JIT 和远程汇编程序。它可以为 x86 和 x64 架构生成本机代码,并支持整个 x86/x64 指令集——从传统的 MMX 到最新的 AVX2。它有一个类型安全的 API,允许 C++ 编译器在编译时甚至在生成或运行汇编代码之前进行语义检查。

看看 Gallopsled 的 pwntools。做你想要它做的所有事情,并且已经内置了大部分。

https://github.com/Gallopsled/pwntools

对于它的一些使用示例,我从 Codegate 2013发表了一些文章,pwnies 也做他们自己的文章

这是“我想将dup文件描述符 #4(例如连接的 TCP 套接字)文件到 stdin/stdout/stderr,并弹出一个 shell”的快速示例

#!/usr/bin/env python
from pwn import *
context.arch = 'amd64' # Default architecture is i386

shellcode = shellcraft.dupio(4) + shellcraft.sh()
print shellcode
print '----'
print enhex(asm(shellcode))
print '----'
print hexdump(asm(shellcode))

打印出来

dup_1:
    push 4
    pop rbp

    push 3
loop_2:
    pop rsi
    dec rsi
    js after_3
    push rsi

    /* call dup2('rbp', 'rsi') */
    push SYS_dup2 /* 0x21 */
    pop rax
    mov rdi, rbp
    syscall

    jmp loop_2
after_3:
    /* execve(path='/bin///sh', argv=['sh'], envp=0) */
    /* push '/bin///sh\x00' */
    push 0x68
    mov rax, 0x732f2f2f6e69622f
    push rax
    mov rdi, rsp
    /* push argument array ['sh\x00'] */
    /* push 'sh\x00' */
    push 0x1010101 ^ 0x6873
    xor dword ptr [rsp], 0x1010101
    xor esi, esi /* 0 */
    push rsi /* null terminate */
    push 8
    pop rsi
    add rsi, rsp
    push rsi /* 'sh\x00' */
    mov rsi, rsp
    xor edx, edx /* 0 */
    /* call execve() */
    push SYS_execve /* 0x3b */
    pop rax
    syscall

----
6a045d6a035e48ffce780b566a21584889ef0f05ebef6a6848b82f62696e2f2f2f73504889e768726901018134240101010131f6566a085e4801e6564889e631d26a3b580f05
----
00000000  6a 04 5d 6a  03 5e 48 ff  ce 78 0b 56  6a 21 58 48  │j·]j│·^H·│·x·V│j!XH│
00000010  89 ef 0f 05  eb ef 6a 68  48 b8 2f 62  69 6e 2f 2f  │····│··jh│H·/b│in//│
00000020  2f 73 50 48  89 e7 68 72  69 01 01 81  34 24 01 01  │/sPH│··hr│i···│4$··│
00000030  01 01 31 f6  56 6a 08 5e  48 01 e6 56  48 89 e6 31  │··1·│Vj·^│H··V│H··1│
00000040  d2 6a 3b 58  0f 05                                  │·j;X│··│
00000046
0490a0e30280a0e30900a0e10810a0e13f0090ef018058e2faffff5a0c008fe20020a0e305002de90d10a0e10b0090ef2f62696e2f736800
0000a0e31eff2fe1

他们还有用于测试 shellcode 的漂亮命令行工具。例如:

$ pwn shellcraft i386.linux.echo "Hello world"
6801010101813424736d6501686f20776f6848656c6c6a04586a015b89e16a0b5acd80

如果将其通过管道传输到文件或其他程序,则会发送原始二进制文件。

$ pwn shellcraft i386.linux.echo "Hello world" | xxd
00000000: 6801 0101 0181 3424 736d 6501 686f 2077  h.....4$sme.ho w
00000010: 6f68 4865 6c6c 6a04 586a 015b 89e1 6a0b  ohHellj.Xj.[..j.
00000020: 5acd 80                                  Z..

您可以打印出原始带注释的程序集:

$ pwn shellcraft i386.linux.echo "Hello world" -f asm
/* push 'Hello world' */
push 0x1010101
xor dword ptr [esp], 0x1656d73
push 0x6f77206f
push 0x6c6c6548
/* call write('1', 'esp', 0xb) */
push SYS_write /* 4 */
pop eax
push (1) /* 1 */
pop ebx
mov ecx, esp
push 0xb
pop edx
int 0x80

或者生成一个 ELF:

$ pwn shellcraft i386.linux.echo "Hello world" --format elf > hello
$ file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped 

甚至自动执行或调试它:

$ pwn shellcraft ... --run
$ pwn shellcraft ... --debug

您还可以在命令行上组装自己的 shellcode:

$ pwn asm nop
90
$ pwn asm nop | xxd
00000000: 90                                       .

今天,在原始帖子和答案发布几年之后 - 还有另一个值得注意的用于从程序集生成机器代码的包 - Keystone

Keystone 是用 C++ 编写的,但绑定了多种语言(包括 Python),并支持多种架构(包括 x86、amd64 和 ARM),因此非常适合!

引用该网站的突出功能:

  1. 多架构,支持 Arm、Arm64 (AArch64/Armv8)、以太坊虚拟机、Hexagon、Mips、PowerPC、Sparc、SystemZ 和 X86(包括 16/32/64 位)。
  2. 干净/简单/轻量级/直观的架构中立 API。
  3. 以 C/C++ 语言实现,可绑定 Java、Masm、Visual Basic、C#、PowerShell、Perl、Python、NodeJS、Ruby、Go、Rust、Haskell 和 OCaml。
  4. 对 Windows 和 *nix 的本机支持(已确认 Mac OSX、Linux、*BSD 和 Solaris)。
  5. 线程安全的设计。
  6. 开源。

Keystone 与Capstone(反汇编程序)和Unicorn(模拟器)一起是更广泛的工具集的一部分

此外,如果你只是想要快速简单的东西(并且不介意使用在线服务) - shell-storm 的在线反汇编程序也基于 Keystone 和 Capstone