在之前的学习中,我们已经了解了在节空白区添加代码,但是有些情况节是没有空白区的,那么我们要怎么来添加我们的shellcode呢?我们可以通过新增节来添加shellcode:
一.新增节思路:
那么我们要怎么新增节呢?在这里给出基本思路:
我们要新增节,那么必须新增一个节表,我们该怎么新增一个节表?
首先,我们需要判断是否有足够的空间来新增节:
SizeOfHeaders-(DOS头大小+DOSstub大小+PE标记+标准PE头大小+可选PE头大小+所有节表大小)>=两个节表大小(80)
这里为什么要留出两个节大小呢?因为机器会做判断,在所有节结束后机器会判断后面40个字节数据是否为零,为零的话机器才会认为所有节结束。
那么如果这里剩余的大小不足两个节表大小怎么办呢?
如果不足两个节表大小,那么我们还能够通过以下的方法来让所有节表后空闲的大小够80个字节:
我们知道DOSstub中的数据都是垃圾数据,那么我们可以将DOSstub中的数据全部删除然后将PE标记,标准PE头,可选PE头全部前移(其他数据不要前移),移动到DOSstub的位置,然后修改DOS头中的e_lfanew字段,让他指向新的PE标记位置,这样在原有节表后就会空闲出大片区域供我们新增节。注意我们新增节后的40个数据应全为0.
二.新增节具体实现:
1.判断是否有足够的空闲区供我们新增节
2.新增节表
3.将新怎解表后的40个数据全改为0
4.修改NumberOfSection的大小(如果新增一个节的话就是+1)
5.修改SizeOfImage的大小
6.修改节表信息(name等)
7.最后记得修改节属性,如果是可以执行的shellcode,那么需要修改为可执行。
本篇文章介绍的是手动新增节,以后在写出新增节的程序时,我会在csdn中发出源代码供大家参考。
本篇文章为本人听课后写的随笔,完全展示我个人理解,如果有理解错误之处,希望大家指出,我会非常虚心地学习,希望我们能共同进步!