我不介意它们是否不是纯Python,但这是首选。
#1 楼
看一下Gallopsled的pwntools。完成您想要的所有事情,并且大部分内容都已内置。在使用它时,我从Codegate 2013收集了一些文章,pwnies也进行了自己的文章。这是一个快速示例,“我要
dup
文件描述符#4(例如,连接的TCP套接字) )到stdin / stdout / stderr,然后弹出一个外壳”。他们还拥有用于测试shellcode的漂亮命令行工具。例如:#!/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
您可以打印出带原始注释的程序集:
$ pwn shellcraft i386.linux.echo "Hello world"
6801010101813424736d6501686f20776f6848656c6c6a04586a015b89e16a0b5acd80
或生成ELF: >甚至自动执行或调试它:
$ 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..
您还可以在命令行上汇编自己的shellcode:
$ 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
#2 楼
一些Python汇编器库:Pyasm-Python x86汇编器
Pyasm是完全用Python编写的功能齐全的动态汇编器。动态意味着它可以在运行时用于在python中生成和执行机器代码,而无需生成目标文件和链接。它本质上允许在x86平台上的Python模块中进行“内联”汇编。尽管它被称为pyasm2,但它本身并不是Pyasm或pyASM的后继者。 pyasm2旨在尽可能地灵活,它将支持x86,SSE和SSE2。
d00ks是ARM汇编器和模拟器。
AsmJit-Python
AsmJit是针对C ++语言的完整JIT和远程汇编器。它可以为x86和x64体系结构生成本机代码,并支持整个x86 / x64指令集-从旧版MMX到最新的AVX2。它具有类型安全的API,该API允许C ++编译器甚至在生成或运行汇编代码之前,在编译时进行语义检查。
#3 楼
今天,在原始帖子和答案发布的几年之后-还有另一个值得注意的程序包,用于从程序集生成机器代码-Keystone。Keystone用C ++编写,但绑定了多种语言(包括Python),并支持多种体系结构(包括x86,amd64和ARM)非常合适!
引用该网站的突出功能:
多体系结构,支持Arm,Arm64(AArch64 / Armv8),以太坊虚拟机,Hexagon,Mips,PowerPC,Sparc,SystemZ和X86(包括16/32/64位)。
清洁/简单/轻巧/直观的体系结构中性API。
以C / C ++实现语言,并具有Java,Masm,Visual Basic,C#,PowerShell,Perl,Python,NodeJS,Ruby,Go,Rust,Haskell和OCaml的绑定。
Windows和* nix的本地支持(Mac OSX,Linux ,* BSD和Solaris已确认)。
设计上是线程安全的。
开源。 (反汇编程序)和独角兽(仿真器)。
此外,如果您只想快速便捷地操作(并且不介意使用在线服务),则Shell-storm的在线反汇编程序也基于Keystone和Capstone br />
评论
这些都不能组装x86 / x64和ARM。
–扎克(Jach)步枪
2014年7月14日23:07