March 1, 2022

关于逆向工程核心原理-删添节区

(简称逆向工程核心原理第十七章)

EXE形式的.reloc节区对运行没什么问题,对DLL/SYS比较重要

删除.reloc节区

理一下步骤

  1. 把.reloc节区头全部变0(不能删,我就在这卡了一会)
  2. 删除.reloc节区
  3. 修改文件头的Number of Sections
  4. 修改可选头的Size of Image

1. 删除.reloc节区头

这片区域变0,且注意一下节区的文件偏移地址

image-20220301175642891

2. 删除.reloc节区

跳转到C000直接删到底

image-20220301175751672

3. 修改IMAGE_FILE_HEADER

将此值修改成4,因为要减少一个节区

image-20220301175912445

4. 修改IMAGE_OPTION_HEADER

减少了那么多东西,这里的内存映像也会减少,之前的图可得知.reloc的内存映像为E40,这里将根据Section Alignment扩展为1000,所以减1000

选中位置改成 00 00 01 00

image-20220301180036936

(于是就全部删完了,程序能正常运行就代表删成功了,这里我就因为删除了节区头卡住了一会)

添加.P.Z节区

1. 添加.P.Z节区头

.P节区头

  1. Name我观察了一下其他节区头,好像都是8个字节,我这边填完就直接前八个字节都当Name用

  2. 再后4个字节是内存大小,我直接填了10,根据Section Alignment会扩展成1000

  3. 于是RVA也就是VirtualSize我往后顺了1000,根据观察.rsrc到.reloc的区别,填了11000

  4. 磁盘文件大小填了10的大小,根据File Alignment会变成200

  5. RAW就在文件结尾D000

  6. 再后面就是空了12个字节的0

  7. 最后是节区属性,还没细究直接复制了.text的属性

再后面就是.Z节区头,记录下不一样的

RVA又往后顺,变成12000

本来应该File Alignment扩展成200,但我这直接往后顺了10,RA2变成D010也没事(算个小坑?)

(刚刚实验了一下填成200也可以,这样也可以需要注意的就是大小填多少,就会读取指定地址的多少个地址)

image-20220301180912415

2. 添加.P.Z数据

直接加了20h的数据,可能加200h更正式点(其实也是现在写才注意到)

(注意在Size of Raw Date那填了多少,就会在指定偏移地址读多少到节区)

image-20220301182142822

3. 修改IMAGE_FILE_HEADER

老地方,直接改成7

image-20220301182234113

4. 修改IMAGE_OPTION_HEADER

还是老地方,由于Section Alignment,加了两个节区,所以加2000变成13000

image-20220301182329397

坚持就是胜利!

程序解析无误且能运行

image-20220301182410807

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.