Bootstrap

4.PE代码节空白区添加shellcode

本节要做一个功能,那就是在程序中植入一段代码,程序打开前会先弹出我们的界面,经过我们的界面之后,再正常运行。这个要怎么做呢?

步骤如下

一:修改编译器随机基址为否

别问为什么,我被坑了1小时,因此这个放在第一步

二:编写shellcode

找一块空白区域代码(我这里找的是.text),插入一个MessageBox程序,首先准备好几个值。

ImageBase,我用的程序是0x00400000

AddressOfEntryPoint,我用的程序是0x00011023,

MessageBoxAddr,我的电脑是0x754B88A0

VirtualAddressOffset,拉伸后的.text偏移,我电脑是0x11000

RawAddress,拉伸前的.text偏移,我电脑是0x400

NewEntryPoint,插入程序的位置,我选择0x00006750,这个值是未拉伸的值

准备好之后插入如下shellcode

shellcode解释

1.6A 00 6A 00 6A 00 6A 00

这一段是MessageBox需要的参数,我们来看反汇编

2.E8

汇编call的字节码

3.43 15 0A 75

这个值是什么意思呢?因为是小端序显示,这段真正的值是75 0A 15 43。

这个值是怎么来的呢?不是说E8是call吗,这个是不是MessageBox的地址,不,这个值不是MessageBox的地址,但是确实是根据它的地址计算出来的,公式如下

我们把75 0A 15 43看成为x,那么,要跳转的地址=E8字节码的地址+5+x;

也就是MessageBoxAddr=E8的地址+5+x=>754B88A0=E8的地址+5+x;

那E8的地址又怎么来?E8的地址也是要经过计算出来的。如下:

E8Address = ImageBase+VirtualAddressOffset+(NewEntryPoint-RawAddress)+8;

根据上面的值可以得到

E8Address=417358;

754B88A0=417358+5+x; => x=754B88A0-417358-5=75 0A 15 43;

4.E9

jmp指令字节码

5.C1 9C FF FF

调到原入口点计算出来的值,计算方式和E8后面的值一样,这里我就不在重复了

原入口点地址+ImageBase=E9地址+5+(FF FF 9C C1)

所有的都计算完毕之后,shellcode就变成了

6A 00 6A 00 6A 00 6A 00 E8 43 15 0A 75 E9 C1 9C FF FF

三:修改入口点

我的入口点偏移位置是0x110,公式为VirtualAddressOffset+(NewEntryPoint-RawAddress)

因此值为0x11000+0x6750-0x400=17350

至此,一切准备就绪,看效果

修改前:

修改后: