WinPwn-JmpESP定位shellcode
与使用静态地址定位shellcode不同的是
由jmp esp
控制程序跳转执行shellcode
覆盖栈中的eip为jmp esp,当函数执行完返回时,由于ret指令相当于pop eip,在配合上我们覆盖的eip,则成功将jmp esp的地址弹出到了eip寄存器中。
之后执行jmp esp,由于此时的esp指向此处,所以程序继续向后执行。进而使程序可以执行在栈空间外,我们覆盖填充的数据 (因此可以简单的理解此处的jmp esp算是起着一个连接程序执行shellcode的作用)
最后 因为esp会自动向后执行使esp+1 的原因,所以程序继续向下执行执行后续的shellcode
寻找exit函数地址
其次就是在上一次实验中还存在的一个问题,程序会崩溃退出,这次我们可以通过执行exit来使程序正常退出,不过这里采用ida的方式来查看函数加载的地址。
通过local windows debugger
来查看程序运行时的加载库地址
搜索jmp esp 跳转指令
metasploit中夹带的一个小工具msfpescan
按理说应该很好用,用于搜索jmp esp 的gadgets
但这里不清楚为什么我搜索到的地址与程序加载的地址始终不同,最终还是通过在ida动态调试中,
搜索字节码ff e4
找到的jmp esp 地址为 0x75C1AE4F
快捷键alt + b调出面板
构造shellcode
之后通过c语言写汇编指令
其中的messagebox
和exit
需要通过上述手段寻找到(借用0day2书中的代码)
1 |
|
然后就是将汇编代码快速转换为字节码的方法有很多,其中比如python的keystone库或者ida或者用专门的工具都可以
或者用工具直接转化,我们只用取从xor开始到call eax为止即可
最后就是这里还有一个我写的快速将字符串转为字节码的小工具(上一次就是因为手动转不明白导致弹出的字符串都乱了,惨)
https://github.com/da1sy/StrToHex
最后我们只用将得到的字节码处理一下再在前面加上填充字符和jmp esp的地址
最后拼接即可完成利用
最后payload
1 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |