2007年11月5日星期一

[Tips]IMail IMAP4D32 LOGIN (<=8.20)调试

by void
http://www.ph4nt0m.org
2007-11-06

2005年的老洞,可利用版本<=imail8.20

问题出在那个wsprintf上,地球人都知道,略掉n字.

LOGIN构造
------------------------------------
a001 LOGIN "@buffer" password\r\n
加上引号后,buffer只过滤五个bad char:0x00,0x0A,0x0D,0x22,0x5C(即'\0','\r','\n',",'\\').不必去用可见字符shellcode.

buffer构造
-----------------------------------
|sc |
|pad |
|addr_ret | jmp esp
|jmp_to_sc|
|addr_wrt |
一些问题
sc: 注意溢出后esp指针在shellcode下面,在shellcode里必须先将esp指到自己头上,否则sc跑着跑着就变成一堆乱码.
addr_ret: 用jmp esp地址覆盖,imap4d2的dll都加载在0x00xxxxxx,所以利用代码不好做成windows版本无关.
addr_wrt: GetIMailHostEntry()里面用到,必须可写.我取了PEB里的地址,测试可行(milw0rm Dreatica-FXP crew那个exploit不知道为什么要取"address to data segment in Mailbox"?! )
jmp_to_sc: 用5字节指令跳转到shellcode.没写错,是5字节."\xe9\x0b\xfe\xff\xff" 所以下面的addr_wrt的低8bit是0xFF.不过无甚影响.


重复溢出
----------------------------------
因为LOGIN命令是在imap4d32.exe的主线程中处理的,所以要做到重复溢出,不crash掉服务,stage1不能直接ExitThread了事,必须返回到溢出点的上层函数,恢复执行流程.
jmp esp覆盖不多,可以恢复流程.
SEH不行,覆盖了stack太多内容,不太可能恢复流程.

复用socket穿墙的问题,目前调试的两个版本用的函数居然不一样:
8.20: inline hook ws2_32.dll recv()
8.10: inline hook ws2_32.dll WSARecv()
注意stage1要设置socket为阻塞来接收stage2 shellcode,否则收不全stage2,就又归咎于RPWT.

没有评论: