首页
社区
课程
招聘
[旧帖] zp1.49脱壳疑问 0.00雪花
发表于: 2014-12-23 11:38 5626

[旧帖] zp1.49脱壳疑问 0.00雪花

2014-12-23 11:38
5626
一软件加的老壳zp1.49.用esp定律顺利到达eop,脱壳后,用ImportREC获取无效指针,用zpfixer修复无效指针成功,然后修复dump出来运行出错!来回做了好几遍结果一样。是不是无效指针找得不对,看别人找到的不只这么多啊,请大牛们帮忙分析下什么原因出错呢!



[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 141
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哪位大牛说下啊,刚开始研究壳,到底不能运行是什么原因呢,无效指针怎么这么少?
2014-12-23 13:35
0
雪    币: 59
活跃值: (1481)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
帮顶。1.49据说有脱壳机。另外,楼主确定不需要补区段?
2014-12-23 15:10
0
雪    币: 141
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
脱壳机脱不了,运行一半就停住了,望大牛说下
2014-12-23 15:25
0
雪    币: 141
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
一百多牛人看了啊,哪位大牛说下啊给个思路或说下原因,谢谢啦
2014-12-24 11:12
0
雪    币: 141
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是IAT没找对么,盼大牛说一下
2014-12-25 10:55
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
拖到 LoadPE 修正下OEP和IAT地址 试试
2014-12-25 16:40
0
雪    币: 141
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
单步跟了一下出错的位置,对比了下,错误位置是一个跳转之后(jmp 01bb283c),跳转后正常的应该是:pushad
push dword ptr ss:[esp+0x20]
call 014A2122
popad
retn
jmp 014C9063
int3
int3这是未脱壳文件正常运行的。而脱壳后这个跳转就跳飞了,就出错了。不知什么原因,如何解决。
2014-12-27 21:44
0
雪    币: 107
活跃值: (1623)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=luodf;1340880]单步跟了一下出错的位置,对比了下,错误位置是一个跳转之后(jmp 01bb283c),跳转后正常的应该是:pushad
push dword ptr ss:[esp+0x20]
call 014A2122
popad
retn
jmp 014C9063
int3
int3这是未脱壳文件...[/QUOTE]

你可以跟进那个call应该是个API调用。看上图你的IAT没找对,如果有API模拟得先去掉,最后不行再补区段。
2014-12-27 22:25
0
雪    币: 141
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
未脱壳文件jmp 01bb283c,可以跳到pushad这段代码,而脱壳后的这个跳转之后没代码了。如何解决呢
2014-12-28 08:54
0
雪    币: 107
活跃值: (1623)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
01bb283c这个内存地址很明显是VirtualAlloc出来的,脱壳后dump是不会保存下来的,所以你得补上这块内存区段,怎么补?自己去找教程。

下面10年做的一点笔记,大部分应该是对的,希望对你有用。
Zprotect  IAT修复方案
Zprotect 导入的各个DLL名字和函数顺序都已经打乱了保存的。保存的格式为
4字节的DLL序号,1字节的导出方式,0为名字,1为序号。后面就是加密了的名字或序列。
解码函数为动态释放出来的代码,只是一些简单的运算。这里可以用VM模拟。

对于修复,上面的信息是没有啥用的,搜索FF15,FF25 然后判断后面的这个值,读他所在的地址值,然后判断是否是push  jmp 如果是就提取一个DWORD,然后去查一个表,然后取得他的地址,最后再判断这个地址是否有效。最后按照ImportREC的方法重建输入表。对于个别名字导出的函数他没有采用push  jmp的方式去加密,而是直接到动态内存去调用了,程序上不好恢复,手脱还是很好识别。可以写个ImportREC的插件。

对于序号导出的函数它不加密,可以直接搜索DLL导出表比对函数地址。序号导出的函数的FirstThunk保存在一个数组中。
形如:
00406000
000000E4
00406004
00000024


ZP加密调用代码的修复
ZP加密调用代码也就是加密CALL指令,CALL  IMM32都变成了JMP  IMM32,这个地址,JMP到的目的地址在动态内存所以需要修正一下。ZP 保存的每条指令信息的格式如下:
每条指令信息占9字节,指令总数保存在重要结构+0xFC这里。
被加密的指令信息保存在0XF8数据块这里
形如:
01 03 00 00 00 05 00 07 00
01 04 00 00 00 01 00 01 00
Memindex1,2 的值不会超过内存块数量,也就是0XF4里保存的值。
{
+0 BYTE     type
+1 DWORD  offset
+5 WORD   memindex1
+7 WORD   memindex2
}

如果是手脱,pushad后ESP定律,几步后到OEP,修复输入表,然后就补区段。
带VM,SDK也要补区段。
每个版本的重要结构的定义都不一样,1490这个结构大小是0x170。
//0x24保存着节数
//0x30 OEP
//0x56 模拟的DLL个数
//0x7e 是否有资源
//0x120 加密后的节信息指针
2014-12-28 10:34
0
雪    币: 141
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
哦,确实不会补区段啊 不过zp1.49貌似不需要补区段吧
2014-12-28 11:24
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
穿上来看下呗
2015-1-11 19:59
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
重建PE文件试试
2015-1-23 20:50
0
游客
登录 | 注册 方可回帖
返回
//