记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

初步分析一段代码(袁哥的ms04-006漏洞利用挑战)

2013-05-11 13:10

http://bbs.2cto.com/read.php?tid=306765

我没有这个环境,没法动态分析。只能初步分析。

以下分析未必正确。

 

该函数有三个参数

第一个参数,与输入数据有关,是个二级指针,第一个字节是长度,之后是一些什么数据

第二个参数,与输出有关,接收目标缓冲区

第三个参数,接收输出长度的指针

 

第三个参数把指针存到esi后,就用来存放第一参数所指的长度。

 


01011d4a 0fb608          movzx   ecx,byte ptr [eax]
01011d4d 8bd1            mov     edx,ecx
01011d4f 81e2c0000000    and     edx,0C0h
01011d55 895510          mov     dword ptr [ebp+10h],edx
01011d58 0f8589000000    jne     wins!GetName+0xaf (01011de7)
wins!GetName+0x26:
01011d5e 83e13f          and     ecx,3Fh
01011d61 40              inc     eax
01011d62 3bcb            cmp     ecx,ebx
01011d64 894d10          mov     dword ptr [ebp+10h],ecx
01011d67 7e28            jle     wins!GetName+0x59 (01011d91)

到这里[ebp+10h]表示6位二进制数00xx xxxx,不能全零

 


wins!GetName+0x31:
01011d69 8b7d0c          mov     edi,dword ptr [ebp+0Ch]
01011d6c 8d5101          lea     edx,[ecx+1]
01011d6f d1ea            shr     edx,1

这里的计算有点奇怪,

如果ecx最低位为0,加1右移1,等于没有加1,这里就感觉丢失数据

如果ecx最低位为1,加1则进位,右移1,移出的是0,这个倒是有效。

 

但是按照上面的过滤,以及到这里的操作,会有数据不对应的情况。

1、上面的6位二进制ecx,如果ecx+1不“溢出”00xx xxxx,那么edx最后表示5位二进制数000x xxxx

2、上面的6位二进制ecx,如果ecx+1   “溢 出”0xxx xxxx,那么edx最后表示6位二进制数00xx xxxx

 

wins!GetName+0x39:
01011d71 8a08            mov     cl,byte ptr [eax]
01011d73 8a5801          mov     bl,byte ptr [eax+1]
01011d76 80e941          sub     cl,41h
01011d79 40              inc     eax
01011d7a 836d1002        sub     dword ptr [ebp+10h],2
01011d7e 80eb41          sub     bl,41h
01011d81 c0e104          shl     cl,4
01011d84 0ad9            or      bl,cl
01011d86 881f            mov     byte ptr [edi],bl
01011d88 47              inc     edi
01011d89 40              inc     eax
01011d8a ff06            inc     dword ptr [esi]
01011d8c 4a              dec     edx
01011d8d 75e2            jne     wins!GetName+0x39 (01011d71)

上面的操作[ebp+10h] 与edx有个对应

 1:[ebp+10h]= 0011 1110 (0x3E)   对应  edx= 0001 1111(0x1F)

 2:[ebp+10h]= 0011 1111 (0x3F)   对应  edx= 0010 0000 (0x20)

 

 当edx减到0时,[ebp+10h]则如下对应

 1:[ebp+10h]=  0  对应  edx= 0

 2:[ebp+10h]= -1  对应  edx= 0

 

引用的代码里面没有说明缓冲区多大,没法确定有无溢出。

这个最好把上层调用一起给出才完整!

 

有机会把这个用OD模拟一番,OD里面模拟运行以及看堆栈结构还是比较好的。

这个要把字节码粘帖到其它程序里,再改eip为函数头,在堆栈里构造参数,单步运行分析了。

知识来源: www.2cto.com/Article/201305/209932.html

阅读:66775 | 评论:0 | 标签:漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“初步分析一段代码(袁哥的ms04-006漏洞利用挑战)”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云