如题所示,为了备战OSCP的缓冲区溢出,特开新篇。
本系列所有的例子均可以在git上找到,链接为:GitHub - freddiebarrsmith/Buffer-Overflow-Exploit-Development-Practice: Good For OSCP Training
本次所用的是第一个例子,brainpan.exe.没记错的话应该是出自vulnbox。
首先第一步,验证程序,使用od打开brainpan.exe,使用自带的brainpan.py进行测试
发现程序存在溢出情况。随机我们需要确认可以对该程序造成溢出的字符量为多少,这里将会用到msf自带的一个脚本,路径为
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb
利用这个脚本的-l参数可以自定义生成不同长度的不同字符,这里选用600来进行测试:
将这串生成的字符写入我们的脚本并进行运用:
程序如约崩溃,打开OD查看此时的EIP值为35724134:
然后继续用msf自带的脚本:
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb
运用-q参数加上eip值确定造成溢出的字节数为524,修改我们的脚本进行运用:
其中'\x41'*524为使程序崩溃的确切数值
'\x42'*4是覆盖ESP的值
'\x43'*(600-524-4)是我们可以用shellcode填充的值
接下来我们需要找到我们可以利用的ESP的值,才能让程序顺利的执行我们的shellcode:
在OD使用ctrl+f,找到我们JMP ESP命令的内存地址:
然后用该地址替换我们脚本中的填充位'\x42'*4,然后在JMP ESP上下断点(F2),如果脚本执行成功的话,程序是会在我们断点处停止:
如图所示,将ESP地址填充后,运行我们的脚本,程序在我们的ESP断点处停止:
生成shellcode之前,我们需要对badchar进行检查:
badchars = ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
"\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
我们可以根据途中EIP的点来大概定位字节位置,然后ctrl+G跳转到该位置,用我们的填充'\x90'和oscptest来判断我们badchcar check的结果,0-9,A-F中间要是有一个缺少了,那就是badchar,我们在生成shell的时候就要对其进行规避,用-b参数,比如-b "\0x00\0x72\0xca"等,oscp据说考试的时候会有几个badchar,这要仔细检查。
有朋友跟我反馈找不到插进去的badchars的问题,时隔多年我都快忘了整个内容了,不过自己调试了下,只需要右键EIP选择break ESP就好
0x00肯定是有问题的,在生成的时候直接排除
接下来我们可以用msf生成一串shellcode,然后编写我们的exploit:
这边出去20个字符的'\x90'是为了跟前边的部分区分开,保证我们的shellcode不被干扰。
接着我们在msf上开一个监听:
然后运行我们的exploit,可以看到有session弹回来:
这边有一点一定要注意,之前我们在测试JMP ESP的时候有下过一个断点,要记得取消,不然一直无法回弹shell。
第一章就到这里,感谢各位