脱壳
参考链接:https://blog.csdn.net/qq_45323960/article/details/127883048?
ops_request_misc=&request_id=de0809d69d604e6ea51b6725ce365671&biz_id=&utm_medium=di
stribute.pc_search_result.none-task-blog-2blogkoosearch~default-2-127883048-null
null.268^v1^control&utm_term=2022CTF%E5%9F%B9%E8%AE%AD&spm=1018.2226.3001.4450
https://blog.csdn.net/weixin_45986910/article/details/107993680
背景
壳实质上是⼀个⼦程序,在程序运⾏时⾸先取得控制权并对程序进⾏压缩,同时隐藏程序真正的OEP。
脱壳的⽬的就是找到真正的OEP。
OEP:程序的⼊⼝点,软件加壳就是隐藏了OEP(或者⽤了假的OEP), 只要我们找到程序真正的
OEP,就可以脱壳。 PUSHAD (所有寄存器压栈) 代表程序的⼊⼝点,POPAD (出栈) 代表程序的
出⼝点。
DLL(Dynamic Link Library)⽂件为动态链接库⽂件,很多Windows可执⾏⽂件并不是⼀个可以完整执⾏
的⽂件,⽽是被分割成了多个DLL⽂件。当我们执⾏⼀个⽂件的时候,对应的DLL⽂件就会被调⽤。
1ITA(Import Address Table):导⼊地址表。在不同版本的Windows系统中DLL的版本不同,那么我们需
要借助ITA,获取函数的真实地址。
分为压缩壳与加密壳
UPX壳
文件特征
4D 5A 90 00开头

自动脱壳
upx -d
常规

发现有个upx壳,
./upx.exe -d attachment-15.attachment-15

即可完成脱壳
手动脱壳
打开发现有UPX壳


放入x64dbg,打开选项勾选入口断点

F9 运行程序
F7 单点过完push

到 push 的下一个指令,右键右边寄存器 RSP 选在内存窗口中转到

在左下内存窗口的阴影处右键选断点 硬件,读取 2字节

再 F9 运行程序
F7 单点执行到 jmp

要多步过几次才能跳出循环,
然后跳转到这

ctrl+i使用插件

自动寻找IAT,然后dump下来

将 × 的删掉, fix dump 一下


然后用IDA打开就行




更新: 2024-11-13 10:36:58
原文: https://www.yuque.com/chaye-apqbl/vsc85q/ic770vecloxmi8yz