思路
把MessageBox()函数的机器码添加到第一个节的空白区,修改程序的入口点,使程序先执行MessageBox()函数在屏幕上显示一个弹窗,然后在jmp回原来的入口点,运行原来程序。
要添加的内容
6A 00 6A 00 6A 00 6A 00 E8 XX XX XX XX E9 XX XX XX XX
6A是push指令,把参数入栈,E8是call指令,调用函数,E9是jmp指令,跳转。
在硬编码中,很多地址是以偏移来计算的,以call指令举例
真正要跳转到的地址=(E8的地址+5)+X(偏移)
X(偏移)=真正要跳转到的地址-(E8的地址+5)
取消基址随机化
有的程序用OD或者xdbg打开,会发现入口点并不是40 0000+OEP,而且每次开机都不一样,这是characteristic里的一个属性导致的,我们把那个属性修改了就可以了。
这里可以借助CFF Explore工具。在CFF Explore中打开要修改的程序
找到Nt Header->Optional Header->DllCharacteristics
点击右边的Click here,把DLL can move取消即可,然后保存程序。
添加代码
提示:再修改程序前,先把原来的程序复制一份,我们用复制出来的程序来调试。
首先找到程序入口点和第一个节在文件中的偏移
程序入口点0x3846EC,第一个节在文件中的偏移0x3804DC,那么它在文件中的地址就是0x3808DC
用OD或xdbg打开程序,在命令处输入bp MessageBoxA
,下一个断点,然后查看这个函数的地址
函数地址在0x7683AE40
接下来确定shellcode要添加的位置,第一个节的代码在0x3808DC就结束了,这里我把shellcode添加在0x3808F0处
修改
加下来开始计算(这里都是十六进制):
E8的地址3808f8
X(偏移)=7683ae40-(3808f8+5 + 40 0000 - 400+1000)=760B 9943
E9的地址3808fd
X(偏移)=7846ec-(40 0000+ 3808fd + 5 - 400+1000)=31ea
修改OEP: 3808F0-400+1000=38 14F0
运行程序
双击程序,出现弹窗。
点击确定,程序正常运行。