朱朱你堕落了 发表于 2024-6-29 13:23

如何到达OEP?

脱壳这个东西,一直都不知道如何下手,比如说想到达OEP吧,你要说一步一步的跟吧,里面代码来回跳,乱七八糟,跟了一会儿,没那个耐心了。
对区段下F2断点,好像也没啥用,ESP定律用不到这个上面,不知道如何下手,好像最基础的脱壳方法都不管用。就说这个程序吧,求助大佬,你拿到手,
你第一步会想到什么,从哪里开始下手来搞,思路是啥。思路肯定有个大概轮廓,从哪方面下手分析,谢谢大佬。

试炼品:
https://www.123pan.com/s/YL29-2ljOh.html

cndml 发表于 2024-6-29 13:23

朱朱你堕落了 发表于 2024-7-1 19:54
老哥,麻烦把dump内存+修改IAT这个做个一两分钟的视频演示吧。

1、dump我用的是x64dbg的ollydumpEx插件,你也可以用Scylla,lordpe 直接dump,用lordpe时候注意修改选项,不要从磁盘加载文件头。dump出来不能执行,看一下入口点对不对,然后修改导入表指向原始导入表即可。当然你也可以重新增加个区段建立新的导入表,也不是不可以。
2、视频演示地址:https://www.123pan.com/s/zoLaTd-Yk7Wd.html

我的爱是你 发表于 2024-6-29 14:19

不开OD软件我也无法运行没有任何界面和提示。
普通OD载入就结束,换过检测OD进去单步里面一直在用zwqueryobject与bug那个API循环检测。

woflant 发表于 2024-6-29 16:05

这里应该是OEP吧,IAT表也能找到



虽然找到OEP,但是XDBG在dump是显示dump失败,具体没看了

-------------------分割线-------------------

简单说下过程,一般加密、压缩类壳,可下断VirtualProtect函数,查找最后一次断下时机,一步步往外层跟

因为解密过程必须要更改PE区段内存属性,不可写入更改为可写入

涉及到IAT表修复的,也会在最后一次断下附近进行IAT修复等操作

一般跟到“jmp eax”、“jmp edx”之类,基本就是跳转到OEP的

这个软件在最后一次VirutalProtect断下后,有两次跳转,一次应该是跳转到开辟的内存区间执行代码,第二次才是跳转OEP

还要注意这个软件的检测,应该是检测,有时候能正常运行,有时会运行异常,貌似是IAT表修复异常导致的,下硬件断点调试就没问题了

woflant 发表于 2024-7-1 10:42

大致看了下dump失败的原因,加壳程序的代码基本在0x511xxx处,0x400000地址处开始,大小0x9000区域,应该是原始程序通过内存拉伸后内容,但由于是加壳程序开辟的内存区域,再将数据复制过来的,没有对应文件偏移,所以无法dump

试过在OEP处,即0x401700处(此时解密等操作应该已经完成),将0x400000-0x409000区间转存到二进制文件,xdbg中通过scylla插件fixdump保存的二进制文件修复导入表,运行windows提示无效PE文件,应该还涉及到PE文件修复等,比较麻烦

cndml 发表于 2024-7-1 11:16

脱壳一个程序,首先要大体了解一下程序,然后寻找突破口,网上给出的一些关键api也是通过分析确认后的经验总结,不一定普适。
1、具体到这个小程序,先运行起来,附加进去,可以看到程序重新分配了内存0x400000,并释放代码其中执行。调试器执行不是每次都能成功,跟踪vitualalloc函数发现程序每次总是从0x400000申请内/8000内存,申请不成功就不会执行,因此可能断定,释放的代码没有重定位表,必须固定基址运行。
2、单开始是关键代码解密,注意esi edi寄存器操作指令,其他寄存器操作指令基本是垃圾代码,等跳到解密后的代码,程序逻辑就基本清楚了。vitualalloc设断点,返回后就是解密后的代码段,没有花指令,很好读懂。
mov eax, dword ptr ss:
add eax, dword ptr ss:
mov ecx, dword ptr ss:
pop esi
pop edi
pop ebx
leave
ret 0xC
往后翻翻代码,在最后就能看到这几行代码,前面的代码,简单读读就能看出,这段代码的主要功能就是模拟系统从磁盘加载文件的方式,从程序自身内部加载pe程序到0x400000基址,并对iat进行重定位,只有四个函数,然后跳转到程序入口开始执行。
3、释放的程序入口在4070FF,在程序最后一个区段,代码不多,也没花指令,主要功能是对text段代码解压缩,然后对iat重定位,再跳到入口执行。
popad
mov ecx, 0xFFC
mov ebx, dword ptr ds:
mov dword ptr ds:, ebx
loop 0x4071CC
nop
nop
mov edx, 0x400000
mov esi, 0x25B0
add esi, edx
mov eax, dword ptr ds:
test eax, eax
je 0x407277
add eax, edx
mov ebx, eax
push eax
mov eax, <&GetModuleHandleA>
call dword ptr ds:
nop上面这个循环指令是完成解码后的text段写入,je之后的程序就是循环对iat重定位,脱过upx壳对这个会很眼熟,地址0x25b0是输入表开始地址,大小就是这个je执行跳转后,si的值减去25b0。
4、je跳转后没几行代码就跳转到程序入口了,这时就可以dump程序了,由于pe程序是从内存模拟磁盘加载的,dump时候需要选择内存,而不是进程dump,dump的时候最后一个区段可以抛弃。
5、dump出的程序不能运行,因为iat表错误,需要手工用前面计算的长度,首地址修改一下导入表即可,都不需要用重建!

朱朱你堕落了 发表于 2024-7-1 19:54

cndml 发表于 2024-7-1 11:16
脱壳一个程序,首先要大体了解一下程序,然后寻找突破口,网上给出的一些关键api也是通过分析确认后的经验 ...

老哥,麻烦把dump内存+修改IAT这个做个一两分钟的视频演示吧。{:301_995:}
页: [1]
查看完整版本: 如何到达OEP?