首页
课程
问答
CTF
社区
招聘
看雪峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
看雪峰会
看雪商城
证书查询
看雪社区
¥付费问答
发新帖
0
6
[旧帖]
申请邀请码之"ZyCkm01.exe"
0.00雪花
2011-1-16 21:02
1861
[旧帖]
申请邀请码之"ZyCkm01.exe"
0.00雪花
seaely
2011-1-16 21:02
1861
申请邀请码之"ZyCkm01.exe"
1.为了获得传说中的邀请码,不得不做好步步为营屡败屡战的长久作战准备
2.呵呵,下面我们有请目标程序闪亮登场
3."ZyCkm01.exe"昂首挺胸大摇大摆的走上前来,浑然不觉一把恶魔之刃已抵在他的脑后
4.请问"ZyCkm01.exe",您今天带来的是什么表演呢?
5.只见"ZyCkm01.exe"跑动了起来,我们看到了两编辑框和一个按钮
6."在我的两个编辑框里输入正确的内容并单击按钮后会有成功提示,否则提示失败"
7.原来这厮就是一个普通的CrackMe(见底部备注1),好,那请我们的"PEiD"评委讲话
8."我没什么好说的,看他那样就是Microsoft Visual C++ 6.0学校毕业的",不愧是久经沙场的老革命呀
9.虽说这位"ZyCkm01.exe"其实是"易语言静态编译"的,不过确实也属于"Microsoft Visual C++ 6.0"的范畴
10.好吧,玩笑话就至此为止了
11.OD载入,F9运行
12.在内容一和内容二中随便输入些内容或者不输入,单击按钮
13.弹出"错误"信息
14.这个弹出信息框是调用了"USER32.MessageBoxA"
15.在命令栏(OD窗口的左下角)里输入"bp MessageBoxA"并回车。目的是让调试器在调用"MessageBoxA"时断下
16.重复第12行的步骤
17.OD中断
18.按F8往下面单步执行
19.至77D5082A处继续F8时弹出了"错误"信息,因为此处的"CALL MessageBoxExA"指令所致
20.现在是在系统领空,不用管他做了些什么(烧杀抢掠由他去),主要目的是回到程序领空(见底部备注2)
21.单击"错误"信息的确定按钮,继续F8执行77D5082F处的"POP EBP"指令
22.现在到了77D50830处,也就是"RET 10"指令的地方
23.观察堆栈窗口,即OD右下角部分,看到栈顶的值为"00401416",也就是将要返回到程序领空。
25.F8,执行"RET 10"指令
/*40140B*/ PUSH EAX
/*40140C*/ PUSH EDX
/*40140D*/ PUSH ECX
/*40140E*/ PUSH 0
/*401410*/ CALL DWORD PTR [<&USER32.MessageBoxA>]
/*401416*/ POP EDI //执行第25行的操作将会来到此处
26.从401416处开始F8单步
/*401493*/ RET //执行此行命令后将会返回到调用此子程序的地方
27.一路顺畅的走到401493处后依然按下F8
/*419C21*/ MOV EAX, DWORD PTR [ESP+C] //执行第27行的操作将会来到此处
/*419C25*/ MOV EDX, DWORD PTR [ESP+10]
/*419C29*/ MOV ECX, DWORD PTR [ESP+14]
/*419C2D*/ ADD ESP, 18
/*419C30*/ RET //继续返回到上级调用处
28.单步至419C30处后继续按下F8
/*4011B7*/ PUSH 00469B5D
/*4011BC*/ PUSH 3
/*4011C1*/ MOV EBX, 00401370
/*4011C6*/ CALL 0040121F
/*4011CB*/ ADD ESP, 28 //执行第28行的操作将会来到此处
/*4011CE*/ MOV ESP, EBP
/*4011D0*/ POP EBP
29.往上滚动鼠标,发现到了一处代码比较多的地方
004010C0 |. 8945 FC MOV DWORD PTR [EBP-4], EAX
004010C3 |. 68 4C9B4600 PUSH 00469B4C ; ASCII "hhc"
004010C8 |. FF75 FC PUSH DWORD PTR [EBP-4]
004010CB |. E8 34FFFFFF CALL 00401004
004010D0 |. 83C4 08 ADD ESP, 8
004010D3 |. 83F8 00 CMP EAX, 0
004010D6 |. B8 00000000 MOV EAX, 0
004010DB |. 0F94C0 SETE AL
004010DE |. 8945 F8 MOV DWORD PTR [EBP-8], EAX
004010E1 |. 8B5D FC MOV EBX, DWORD PTR [EBP-4]
004010E4 |. 85DB TEST EBX, EBX
004010E6 |. 74 09 JE SHORT 004010F1
004010E8 |. 53 PUSH EBX
004010E9 |. E8 37010000 CALL 00401225
004010EE |. 83C4 04 ADD ESP, 4
004010F1 |> 837D F8 00 CMP DWORD PTR [EBP-8], 0
004010F5 0F84 58000000 JE 00401153
004010FB |. 6A FF PUSH -1
004010FD |. 6A 08 PUSH 8
004010FF |. 68 03000116 PUSH 16010003
00401104 |. 68 01000152 PUSH 52010001
00401109 |. E8 1D010000 CALL 0040122B
0040110E |. 83C4 10 ADD ESP, 10
00401111 |. 8945 F4 MOV DWORD PTR [EBP-C], EAX
00401114 |. 68 509B4600 PUSH 00469B50 ; ASCII "seaely"
00401119 |. FF75 F4 PUSH DWORD PTR [EBP-C]
30.可以看到OD已经分析出了两个字符串"hhc"和"seaely"
31.接着从最开始的第一条指令开始分析
004010A1 /. 55 PUSH EBP
004010A2 |. 8BEC MOV EBP, ESP
004010A4 |. 81EC 14000000 SUB ESP, 14
004010AA |. 6A FF PUSH -1
004010AC |. 6A 08 PUSH 8
004010AE |. 68 02000116 PUSH 16010002
004010B3 |. 68 01000152 PUSH 52010001
004010B8 |. E8 6E010000 CALL 0040122B ; 取出内容一的文本
004010BD |. 83C4 10 ADD ESP, 10
004010C0 |. 8945 FC MOV DWORD PTR [EBP-4], EAX ; 将内容一的文本传递给第一个局部变量
004010C3 |. 68 4C9B4600 PUSH 00469B4C ; ASCII "hhc"
004010C8 |. FF75 FC PUSH DWORD PTR [EBP-4] ; 我在内容一里输入的是"qwert"
004010CB |. E8 34FFFFFF CALL 00401004 ; 执行后发现eax的值变为1了,估计就是说传进去的两个值不相等吧
004010D0 |. 83C4 08 ADD ESP, 8
004010D3 |. 83F8 00 CMP EAX, 0
004010D6 |. B8 00000000 MOV EAX, 0
004010DB |. 0F94C0 SETE AL ; 百度了一下,说这是相等置位,但还是不知道是啥意思
004010DE |. 8945 F8 MOV DWORD PTR [EBP-8], EAX ; 将第二个局部变量赋值0
004010E1 |. 8B5D FC MOV EBX, DWORD PTR [EBP-4] ; 将第一个局部变量的值给ebx,执行后ebx="qwert"
004010E4 |. 85DB TEST EBX, EBX
004010E6 |. 74 09 JE SHORT 004010F1
004010E8 |. 53 PUSH EBX
004010E9 |. E8 37010000 CALL 00401225 ; 将"qwert"作为参数传入,执行后eax又变成1了?
004010EE |. 83C4 04 ADD ESP, 4
004010F1 |> 837D F8 00 CMP DWORD PTR [EBP-8], 0
004010F5 75 5C JNZ SHORT 00401153 ; 规规矩矩的单步到此处后发现他要跳到00401153处了,还有内容二都不判断了,看来露馅了,不能让他跳,JZ改为JNZ
004010F7 90 NOP
004010F8 90 NOP
004010F9 90 NOP
004010FA 90 NOP
004010FB |. 6A FF PUSH -1
004010FD |. 6A 08 PUSH 8
004010FF |. 68 03000116 PUSH 16010003
00401104 |. 68 01000152 PUSH 52010001
00401109 |. E8 1D010000 CALL 0040122B ; 取出内容二的文本
0040110E |. 83C4 10 ADD ESP, 10
00401111 |. 8945 F4 MOV DWORD PTR [EBP-C], EAX ; 将内容二的文本保存在第三局部变量
00401114 |. 68 509B4600 PUSH 00469B50 ; ASCII "seaely"
00401119 |. FF75 F4 PUSH DWORD PTR [EBP-C]
0040111C |. E8 E3FEFFFF CALL 00401004 ; 估计是判断内容二是否正确,执行此句后,eax=FFFFFFFF
00401121 |. 83C4 08 ADD ESP, 8
00401124 |. 83F8 00 CMP EAX, 0
00401127 |. B8 00000000 MOV EAX, 0
0040112C |. 0F94C0 SETE AL
0040112F |. 8945 F0 MOV DWORD PTR [EBP-10], EAX
00401132 |. 8B5D F4 MOV EBX, DWORD PTR [EBP-C]
00401135 |. 85DB TEST EBX, EBX
00401137 |. 74 09 JE SHORT 00401142
00401139 |. 53 PUSH EBX
0040113A |. E8 E6000000 CALL 00401225
0040113F |. 83C4 04 ADD ESP, 4
00401142 |> 837D F0 00 CMP DWORD PTR [EBP-10], 0
00401146 75 0B JNZ SHORT 00401153 ; 发现和刚才那个跳的目的地一样,有鬼,同样JZ改JNZ
00401148 90 NOP
00401149 90 NOP
0040114A 90 NOP
0040114B 90 NOP
0040114C |. B8 01000000 MOV EAX, 1
00401151 |. EB 02 JMP SHORT 00401155 ; 发现在此处非常猥琐的绕过了那个出错跳转的目标地址
00401153 |> 33C0 XOR EAX, EAX
00401155 |> 85C0 TEST EAX, EAX
00401157 |. 0F84 3B000000 JE 00401198 ; 经过上面两次捣蛋后,此处跳转未实现
0040115D |. 68 04000080 PUSH 80000004 ; 接下来继续安分的往下面单步
00401162 |. 6A 00 PUSH 0
00401164 |. 68 579B4600 PUSH 00469B57
00401169 |. 68 01030080 PUSH 80000301
0040116E |. 6A 00 PUSH 0
00401170 |. 68 00000000 PUSH 0
00401175 |. 68 04000080 PUSH 80000004
0040117A |. 6A 00 PUSH 0
0040117C |. 68 589B4600 PUSH 00469B58
00401181 |. 68 03000000 PUSH 3
00401186 |. BB 70134000 MOV EBX, 00401370
0040118B |. E8 8F000000 CALL 0040121F ; 此句运行后弹出"正确",嘿嘿,目的达到了,虽然不够光明磊落
00401190 |. 83C4 28 ADD ESP, 28
00401193 |. E9 36000000 JMP 004011CE
00401198 |> 68 04000080 PUSH 80000004
0040119D |. 6A 00 PUSH 0
0040119F |. 68 579B4600 PUSH 00469B57
004011A4 |. 68 01030080 PUSH 80000301
004011A9 |. 6A 00 PUSH 0
004011AB |. 68 00000000 PUSH 0
004011B0 |. 68 04000080 PUSH 80000004
004011B5 |. 6A 00 PUSH 0
004011B7 |. 68 5D9B4600 PUSH 00469B5D
004011BC |. 68 03000000 PUSH 3
004011C1 |. BB 70134000 MOV EBX, 00401370
004011C6 |. E8 54000000 CALL 0040121F
004011CB |. 83C4 28 ADD ESP, 28 ; 执行第28行的操作将会来到此处
004011CE |> 8BE5 MOV ESP, EBP
004011D0 |. 5D POP EBP
004011D1 \. C3 RET
32.接着保存所有修改到文件就可以了,无论输入什么都是正确
33.整个过程总共修改了两条指令,当然也可以只修改一条
34.Ctrl+F2重新载入程序,将004010F5(第一个跳向错误处)的代码改为“JE 0040115D”即可
备注1:CrackMe,给别人尝试破解的小程序
备注2:领空,即当前代码所运行到的地方,也就是寄存器EIP所指的地方。OD窗口右上角为寄存器列表。观察OD窗口的标题栏即可知道当前是否处于系统领空。
终于写完了,百感交集呀
还有这里面说的也不知道正确与否,忘大家不吝赐教。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
收藏
・
0
点赞
・
6
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
最新回复
(
2
)
seaely
雪 币:
114
活跃值:
(25)
能力值:
( LV3,RANK:20 )
在线值:
发帖
4
回帖
64
粉丝
0
关注
私信
seaely
2011-1-16 21:04
2
楼
0
附上"ZyCkm01.exe"
上传的附件:
ZyCkm01.zip
(272.61kb,2次下载)
ZyCkm01.jpg
(13.34kb,35次下载)
邋遢鬼
雪 币:
31
活跃值:
(43)
能力值:
( LV3,RANK:20 )
在线值:
发帖
19
回帖
533
粉丝
0
关注
私信
邋遢鬼
2011-1-16 21:10
3
楼
0
楼主好强,顶上
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
seaely
4
发帖
64
回帖
20
RANK
关注
私信
他的文章
申请邀请码之"ZyCkm01.exe"
1862
[下载]分享一个小工具
864
[原创][申请邀请码]OllyDbg小小的DIY
2613
该上哪找共享软件捣?
1254
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
返回
顶部