原理:因为PE文件3个段都需要对齐200h,这样就会导致会有很多填充0,在填充0的地方就有机会进行插入恶意代码
在原有的PE文件的基础上修改,文件是我之前发布的一篇博客PE文件构造
主要思路:原来的PE文件中.text的有MessageBoxA函数和ExitProcess函数,执行后会跳出一个窗口然后退出。现在新加一个窗口函数MessageBoxExa,在该函数的最后用jmp跳到第一个窗口函数的地址,然后把代码的进入地址AddressOfEntryPoint改成新加函数的起始地址,这样就可以先弹出新加的窗口,然后再弹出原来的窗口,最后退出,新加的函数可以看成是恶意代码
跳转指令一共有三种:
Short Jump(短跳转)机器码为 EB,只能跳转到256字节的范围内
Near Jump(近跳转)机器码 为E9,可跳至同一个段的范围内的地址
Far Jump(远跳转)机器码为EA,可跳至任意地址,使用48位/32位全指针
因为要跳转的地址跟原来地址在同一个段内,所以本实验采用近跳转的方式
目录
1、修改.data段
2、修改.text段
3、修改.rdata段
4、运行结果
1、修改.data段
设置第二个弹出的窗口,标题为By Lyt,消息为Hello PE2
记录新加的标题的地址为080F,RVA为40300F,字符串的地址为0816,RVA为403016,后续填.text段的时候会用到
2、修改.text段
整个程序汇编代码如下
6A 00 push 0 ;第一个消息框风格(0表示默认风格)
68 00304000 push 0x403000 ;标题字符串所在的地址
68 07304000 push 0x403007 ;内容字符串所在的地址
6A 00 push 0 ;消息框所属窗口句柄
FF 15 ???? call ptr[????] ;调用MessageBoxA
6A 00 push 0 ;ExitProcess函数的参数,程序退出码
FF 15 ???? call ptr[????] ;调用ExitProcess
6A 00 push 0 ;第二个消息框风格
6A 00 push 0 ;语言标识符(0表示使用默认语言)
68 0F304000 push 0x40300F ;标题字符串所在的地址
68 15304000 push 0x403016 ;内容字符串所在的地址
6A 00 push 0 ;消息框所属窗口句柄
FF 15 ???? call ptr[????] ;调用MessageBoxExa
E9 ???? jmp ???? ;跳到MessageBoxA函数的起始地址
ExitProcess的函数后面添加MessageBoxExa函数的参数,????都先填为AA AA AA AA,后面再具体确定
修改前
修改后
确定E9后面的地址:
一开始代码进入地址AddressOfEntryPoint为00 00 10 00(RVA地址),也就是原来MessageBoxA函数起始地址,所以目的地址是00 00 10 00,jmp的地址是432h,转换成RVA是00 00 10 32,jmp指令的长度为5字节,
E9后面的值=目的地址-(jmp指令地址+5)=00 00 10 00-(00 00 10 32+5)=FF FF FF C9(这里减法是一位一位运算,不够就向前面一位借16), FF在前面表示为负数,即往前面跳转,反写为C9 FF FF FF,所以jmp后面应该跟上C9 FF FF FF,即写成E9 C9 FF FF FF
新加的窗口函数的RVA=00 00 10 1C,反写为1C 10 00 00,所以把代码进入地址AddressOfEntryPoint从00 10 00 00改成1C 10 00 00,这样就会从新加的窗口函数开始执行,修改后如下
3、修改.rdata段
修改前
修改后
这里看不懂的可以看我之前发布的一篇博客PE文件插入函数教程
返回修改.text段还未确定的call函数地址
MessageBoxA的VA地址00402008h ,所以反过来填入08 20 40 00
MessageBoxExa的VA地址0040200Ch,所以反过来填入0C 20 40 00
ExitProcess的VA地址00402000h,所以反过来填入00 20 40 00
最后.text如下
4、运行结果
先弹出HelloPE2,点击确认后再弹出HelloPE