【逆向工程】在PE结构空白区段插入代码

最近在学PE结构,遇到了个比较有意思的实验,学过PE结构的都知道因为文件对齐FileAlignment和区块对齐SectionAlignment的缘故,在磁盘中的PE文件的块与块表 块与块之间有许多的空白间隙,这些间隙以0为填充,在文件执行中这些空白是没有意义的,所以我们就可以利用这段空白插入我们想执行的一些代码。
在这里插入图片描述
演示程序 经典扫雷
演示dll user32.dll.MessageBoxW
演示所用工具 X64dbgPEGAME,010Editor
演示目标 实现修改程序使其弹出一个MessageBox消息对话框
在这里插入图片描述

查看硬编码

这里用user32.dll中的MessageBoxW函数为例,MessageBoxA也可以,无非一个是宽字节版一个是单字节版,可以在VC中调用此接口然后调试查看反汇编代码。
获取硬编码如下

PUSH 6A 00 
CALL E8 00 00 00 00 
JMP  E9 00 00 00 00

PUSH 指令通常用于在函数调时传递参数,会在函数调用时将参数压如栈中
CALL 通常用来调用函数 后面的00 00 00 00为跳转步长
JMP 无条件跳转指令 使用该指令无条件跳转到我们想要的指令处

查看所引用的DLL在程序中的VA地址

注意该程序必须导入了user32.dll这个动态链接库,否者将不会又MessageBox这个函数接口,也就无法找到该函数地址
将演示程序加载进动态调试工具X64dbg,Ctrl+G定位到该程序中MessageBox的函数,
在这里插入图片描述
获取该VA地址为76AB1E50在这里插入图片描述

插入硬编码

将演示程序加载入十六进制编辑工具,选择一个空白区段,我这里选的是第一个区块和第二个区块之间的空白区段
我们若想插入MessageBox函数必须用PUSH指令先传递所需参数,CALL指令调用,JMP指令再回到原本程序正常执行处,即AddrressOfEntryPoint处。
查阅WIN32API 可知MessageBox的四个参数都可为0
在这里插入图片描述

CALL 指令调用,因此我们需要计算下CALL指令的步长,有两种方法
步长=要跳转的目的地址-当前指令地址-指令长度
步长=要跳转的目的地址-当前指令的下一条指令地址
我们采用第一个公式
在上面我们已经得到了MessageBoxW的地址即要跳转的目的地址为76AB1E50
当前指令的地址即CALL指令E8的地址为40A8
但要注意的是76AB1E50为VA即虚拟地址,40A8为文件偏移地址Fileoffset,因此需要将40A8转化为虚拟地址。
这里可以手算,因为插入硬编码的地址在区块中,所以计算公式为

VA=Fileoffset-ImageBase-(所在区块.VirtualAddress-所在区块.PointerToRawData)

也可以借助带有地址转换工具的PE结构查看器,如LordPE,我这里用我自己写的PE结构查看工具,感兴趣的话可以移步至【逆向工程】QT编写PE结构分析工具
在这里插入图片描述
查看到其VA地址为1004AA8
E8 00 00 00 00指令长度为五字节
则步长=76AB1E50-1004AA8-5=75AA D3A3
因为PE文件是小端存储所以 应该插入A3 D3 AA 75
在这里插入图片描述

我们调用完MessageBoxW后还需要让程序正常执行,因此还要JMP指令跳转到程序入口处,通过PE查询工具可以看到程序入口,这里还是使用我自己编写的PE结构查询工具查看。
在这里插入图片描述

则JMP指令步长=1003E21-1004AAD-5=FFFF F36F
同样的小端存储格式 E9 6D F3 FF FF
在这里插入图片描述

修改程序入口AddressOfEntryPoint

操作完如上步骤后,程序并不会执行我们的代码,因此还需要修改程序的入口地址为我们插入代码的地址,这里直接用十六进制编辑工具修改,这里填入的数字应该是RVA地址
在这里插入图片描述

在这里插入图片描述
插入的代码只能在本机上运行,还算不上是ShellCode。
白菜信安网

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘乙兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值