BSides San Francisco CTF 2017-b_64_b_tuff
1.常规checksec下,只开了NX,之后IDA打开文件之后,有如下语句:
1 | #注释头 |
这里v7是输入的Buf,v5是mmap分配的内存空间。之后的语句:代表了将v5对应的内存空间强制转化为函数指针并且调用,在汇编代码中也可以看出来:这里的[ebp+var_18]就是我们输入的buf经过编码base64编码后存放的地方。
1 | #注释头 |
3.所以我们输入的内容就成了会被执行的汇编代码,也就是可以输入Shellcode,来执行我们需要的命令。这里可以看一个连接网址,从里面找shellcode:
http://shell-storm.org/shellcode/
可以通过linux/x86/sh/bash/execve/shellcode等等关键词来查找,这里直接给出一个可用的shellcode:
1 | #注释头 |
4.但是有Base64_encode,所以我们输入的需要会被base64编码,而base64编码只能由只由0-9,a-z,A-Z,+,/这些字符组成,(这里就是对应的ascii转换表中内容)所以常规的shellcode就不合格,我们这里选中的shellcode中某些字符就没办法被base64编码,所以这里需要用到msfvenom来选择一个可用的编码器,将我们常规的shellcode编码成可以被base64编码的shellcode。
5.打开Linux,输入msfvenom -l encoders可以查看编码器,后面有介绍,可以看一下,从中选择一个可用的编码器对shellcode进行编码即可。
6.查到x86/alpha_mixed这个编码器可以将我们输入的shellcode编码成大小写混合的代码,符合条件。
x86/alpha_mixed low Alpha2 Alphanumeric Mixedcase Encoder
运行编码器的代码如下:
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
7.输入这段代码运行之后可以看到当前文件夹目录下生成了一个payload文件,文本打开就可以看到编码后的shellcode:
PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIp1kyigHaX06krqPh6ODoaccXU8ToE2bIbNLIXcHMOpAA
8.之后需要将这段可以被Base64编码的进行Base64解码,得到的shellcode再被程序中的Base64编码后才是我们真正起作用的shellcode。利用python脚本即可。
▲
1.’import sys; sys.stdout.write(“shellcode”)’:这是导入包之后写入编码的shellcode。
2.由于msfvenom只能从stdin中读取,所以使用Linux管道符”|”来使得shellcode作为python程序的输出。
3.此外配置编码器为x86/alpha_mixed,配置目标平台架构等信息,输出到文件名为payload的文件中。
4.由于在b-64-b-tuff中是通过指令call eax调用shellcode的eax,所以配置BufferRegister=EAX。最后即可在payload中看到对应的被编码后的代码。这段shellcode代码就可以被base64编码成我们需要的汇编代码。
参考资料:
https://bbs.ichunqiu.com/forum.php?mod=collection&action=view&ctid=157