CCProxy Telnet Proxy Ping远程栈溢出分析

    [多云 December 11, 2007 21:49 | by ]
By:疯狗(B.C.T)

简单的了解了一下漏洞原因,问题出在ping上,首先先触发这个漏洞看看效果。
开启CC,然后telnet 127.0.0.1 23,出现如下提示
CCProxy Telnet>CCProxy Telnet Service Ready.
CCProxy Telnet>
直接输入ping AAAAAAAAAA...(超长的A),程序崩溃了,看看提示

Highslide JS


程序在读取41414141也就是AAAA时出错,41414141是我提交的超长的AAA...并不是正确的指令,况且这里的内存还是为分配的,典型的栈溢出。

漏洞分析暂时略过,已经被分析的很透彻了,CC在发ping命令的时候用的是send函数和WSASend函数, send一次只能发送一个缓冲区,而且效率底下,WSASend可以发送多个缓冲区,而且性能要比send高,所以CC肯定使用了WSASend,经过一些人的分析确实如此。

OD载入,动态分析,这次我使用了cooldiyer的检测溢出点的程序,在xfocus下的好code,工具的原理(借助于英文26个字母实现了26进制,4位最多可以到ZZZZ也就是26的4次方就是十进制的456976十六进制的0x6f910,原理是因为编译器字节对齐默认情况下是按双字(4bytes)对齐的)

AAAD 4 0x04 EIP ==> 0x44414141
AAAH 8 0x08 EIP ==> 0x48414141
AAAL 12 0x0c EIP ==> 0x4c414141

...
生成了3000个字符进行提交后读取的数值变成了这样

Highslide JS


变成了424e4241
手工调试跟踪了几次,查看寄存器窗口,发现了想要的东西,被覆盖的ESP,还有面目全非的EIP:)

Highslide JS



By:疯狗(B.C.T)

简单的了解了一下漏洞原因,问题出在ping上,首先先触发这个漏洞看看效果。
开启CC,然后telnet 127.0.0.1 23,出现如下提示
CCProxy Telnet>CCProxy Telnet Service Ready.
CCProxy Telnet>
直接输入ping AAAAAAAAAA...(超长的A),程序崩溃了,看看提示

程序在读取41414141也就是AAAA时出错,41414141是我提交的超长的AAA...并不是正确的指令,况且这里的内存还是为分配的,典型的栈溢出。

漏洞分析暂时略过,已经被分析的很透彻了,CC在发ping命令的时候用的是send函数和WSASend函数, send一次只能发送一个缓冲区,而且效率底下,WSASend可以发送多个缓冲区,而且性能要比send高,所以CC肯定使用了WSASend,经过一些人的分析确实如此。

OD载入,动态分析,这次我使用了cooldiyer的检测溢出点的程序,在xfocus下的好code,工具的原理(借助于英文26个字母实现了26进制,4位最多可以到ZZZZ也就是26的4次方就是十进制的456976十六进制的0x6f910,原理是因为编译器字节对齐默认情况下是按双字(4bytes)对齐的)

AAAD 4 0x04 EIP ==> 0x44414141
AAAH 8 0x08 EIP ==> 0x48414141
AAAL 12 0x0c EIP ==> 0x4c414141
...
生成了3000个字符进行提交后读取的数值变成了这样

变成了424e4241
手工调试跟踪了几次,查看寄存器窗口,发现了想要的东西,被覆盖的ESP,还有面目全非的EIP:)

(cooldiyer的那个小程序)123.exe -c 3000 -v 输出内存数据
然后查找EIP现在的值0x424e4241
ABNB 1016 0x3f8 EIP ==> 0x424e4241
OK,EIP的位置就是提交1012个字符后的位置
在用相同的方法找ESP指向的位置,寻找AAAH
AAAH 8 0x08 EIP ==> 0x48414141
GOOD,是字符串开始的4 字符,为什么?1字符=2字节,2×4=8...

关于exploit,不想浪费太多精力在上面,昨天就浪费好多时间在写shelllcode上,网上那么多随便找个不就得了:(

不过还是要分析下这个exploit中感兴趣的部分

memset(Buff, 0x90, sizeof(Buff)-1); //NOP空操作填充 程序不中断 一直往下走
...
memcpy(&Buff[1017], JUMPESP,4); //ping+空格+1012个字符正好到EIP:) 1017个字符厄
memcpy(&Buff[9], shellcode,sizeof(shellcode)-1); // ping+空格+4 控制ESP

后来得知由于填充数据太长,shellcode被放在了前面的1017个字符中,而且程序在前面有个ESI可以被控制,指向的正是填充数据区域,所以利用格式就是ping+空格+AAAA...+shellcode+jmp esi。

ok,分析到此结束,这次分析主要依靠cooldiyer的小工具和其分析思路,拜一个,但是在学习别人的同时自己理解才是最重要的!!溢出分析真的很有意思,近期就会投入到工作范围中了吧:)
Technology | Comments(0) | Trackbacks(0) | Reads(9877)
Add a comment
Emots
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
Enable HTML
Enable UBB
Enable Emots
Hidden
Nickname   Password   Optional
Site URI   Email   [Register]
               

Security code Case insensitive