-
-
未解决
[原创]脱壳之UPX脱壳步骤及问题
-
发表于:
2019-4-28 21:51
11739
-
我用的是UPX3.09的壳
程序是自己写的,是个HelloWord,只是为了练习脱壳而使用的
载入OD后依旧是使用ESP定律脱壳,ESP定律从我这次脱壳来理解的话,就是程序开始时有个PUSHAD指令来保存所有寄存器状态,PUSHAD指令就想是大括号,有PUSH就有POP,两者共同的特点就是修改了ESP寄存器的值,所以我们需要在被修改的值上下硬件断点,来找到POP指令的位置,找到POP后就离原本的程序OEP不远了
按下F9,正如之前所说,可以找到POPAD指令,所以此处应该就是壳结束源程序开始的位置(但还不是OEP),下面的jmp指令做了跨段跳转,根据加密与解密中给出的四种脱壳技术讲解,jmp作出跨段跳转也是即将到达OEP的信号
执行到jmp后就来到这里,需要F7步入
这里就是OEP了(经历了无数次错过后的经验)
到OEP后需要用ollydump插件来dump出源程序,因为需要手工重建输入表,所以这里没选
在使用importREC之前还需要得到RVA的位置,在OEP处有个call 401652,此处按回车就可以看到call中又call了kernel32的函数,选择数据窗口中跟随,看到了IAT的可能的起始地址是402000,而IAT的可能的结束位置在4020b4,大小是b4
程序基址是400000,OEP的位置是40169f,所以OEP处填169f,RVA处填2000,大小填B4,获取导入表后就可以直接点修正转储了
接下来是问题:
1、 在脱壳的时候发现程序开了ASLR和不开ASLR区别很大(我用VS写的程序),开了ASLR后IAT根本就是乱的,修正转储时会报错,不明白原理,希望有大佬出来解释下,是不是恶意文件在编译的时候开启ASLR并且加壳,就会对脱壳产生很大的难度
2、 车里虽然关闭了ASLR,但是修正转储后的文件依然无法运行(闪退),所以我之前OD找到IAT时用的是可能的地址,难道说这IAT还有别的地址??
3、
在IAT自动搜索时会多出来两个用户代码的函数(主要是看地址位置为用户代码区),我怀疑之所以程序不能运行可能和这两个函数有关,有没有大佬指点下,鄙人感激不尽o(╥﹏╥)o
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)