输入表

1、输入表

1.1 输入表结构

8HApfU.png
OriginalFirstThunk和FirstThunk相似,它们分别指向两个本质上相同的数组IMAGE_THUNK_DATA结构。
8HAfc4.png
它是一个指针大小的联合体(union)。每个IMAGE_THUNK_DATA元素对应于一个可执行文件输入的函数。具体如下:
8HEYr9.png
IMAGRE_IMPORT_BY_NAME结构仅有一个字节大小,存储了一个输入函数的相关信息,结构如下:
8HViZR.png

1.2 输入地址表

OriginalFirstThunk是单独的一项,不可改写,称为INT。FirstThunk是PE装载器重写的。PE装载器首先搜索OriginalFirstThunk,如果找到,加载程序就迭代搜索数组中的每一个指针,找出每一个IMAGRE_IMPORT_NAME结构所指向的输入函数的地址。然后,加载器用真正的入口地址来替代由FirstThunk指向的IMAGE_THUNK_DATA数组里元素的值。因此该表被称为输入地址表(Import Address Table,IAT)
8HeRaR.png

2、一道CTF实例(脱壳后IAT表修复)

在这里我们主要讲IAT表,脱壳过程不做讲解。
8HnoHH.png
从图中我们可以看出该文件的IAT表是错的。
打开OD,右键->查找->当前模块中的名称
8HK8Fs.png
可以看到,该程序第一个调用的为Sleep函数,该函数在PE中的偏移位置为26A4,我们继续查找PE中出现26A4的地方,如图所示:
8HKh0e.md.png
该位置即为IID数组的位置。
我们还要找到该程序加载了几个DLL,通过搜索我们可以发现,它调用了KERNEL32.dll(偏移位置27B0)、MSVCP90.dll(偏移位置24D0)、MSVCR90.dll(偏移位置2500)三个DLL。
现在我们开始修复IAT表,在2000位置插入
8HaN5V.png
然后在空闲位置输入新的IAT表,改变的位置为2800和大小C8。
8Hd1JK.png
程序成功运行。