【逆向入门】 CrackMe160-005 分析思路

CrackMe160-005

这道题难度严重超标了。。纯小白的我呕心沥血才算勉强搞明白了,并且也学到不少东西,不多说废话,来看题

爆破思路

养成好习惯,爆破流程第一步,用exeinfo打开看看文件是否加壳并且使用的什么语言

img

可以看出有UPX的壳,那么我们直接使用UPX脱壳软件就可以产生一个新的,已经脱壳完成的exe了,原来的exe已经在后面加上了.bak后缀,已经是备份文件了,这里我们打开生成的exe

img

这诡异的三字经,阴间的黑白配色,名字里的层层设防。。。一切看起来都那么“和蔼”

既然直接爆破的话,我们试试直接点击注册看看会怎么样

卧槽没反应。。。。可恶。。。

输入值再试也还是一样。此时已经能感受到ajj师傅浓浓的恶意了

点击图片会有提示(谢天谢地)

img

不过如果只是爆破的话,我们做到这里就可以直接尝试搜索字符串了

img

搜索的时候就不用搜那么准确了,比如一般如果注册成功就会有“注册成功”这几个字出现,所以我们直接搜注册就可以

这里可以看到有一个注册了,看起来很像是注册成功的意思,我们点进去看看

img

对味了!

往上面翻一下找找关键跳转

img

不难发现这里有五个验证跳转。。。。也代表本次的序列生成的难度之高。。。

不过作为爆破的话,只要将这里的跳转都nop掉就可以了

img

请忽略多出来的一个输入框和里面的内容。。是进行了其他操作才有的

可以看到鼠标在放到图片上的时候会提示 “厉害厉害真厉害!佩服佩服真佩服!!”,并且原来的注册按钮此时也变成了“注册了”

那么简单粗暴的爆破就完成了。接下来就是地狱级的折磨了。。。

序列生成

既然有五个判断条件跳转,我们就应该让这五个判断条件都不成立就可以了

另外,这个程序仍然是使用delphi编写的,所以我们也要结合Delphi Decompiler(以下简称DD)去看一下对应的事件执行

补充一点基础知识,在向上一行行读代码的时候,一般只要找到函数入口点就可以了,我们可以在函数入口点打上断点,并观察是如何触发的

而函数入口点一般是如下特征

push ebp
move ebp, esp

或者是位于ret之下

而这里呢,我们并没有发现应该有的函数入口特征

img

在004473B0这里已经是ret了,但是下面的代码看起来并不是函数入口的样子

这里我们结合DD来看,发现在这个地址附近有个事件调用的地址

img

img

也就是说,这个004473E4就是事件Timer2Timer的入口点,在事件Timer2Timer发生时就会从004473E4开始执行,所以其实也相当于函数入口点了,那么我们在这里打个断点试试看怎样才能触发这个事件

发现似乎是到一个时间点就会触发这个事件,然后如果程序暂停也不会影响。可以猜测这个事件的触发是根据机器的时间决定的,大概是每8秒触发一次(自己数的,可能不准)

既然每隔8秒就会判断一次,那么我们只要确保这5个条件跳转不执行就可以了

304

004473E7 | 81BB 04030000 340C0 | cmp dword ptr ds:[ebx+304],C34 |

004473F1 | 0F84 88000000 | je ckme002bak.44747F |

意思是304存的这个值不能等于C34

那么我们就应该寻找304这个地址所有的操作记录,方法叫做常量查找,鼠标右键->查找引用->常量:304

img

可以看到有3个,先点开第一个看看

img

所以不能让这一行执行,往上面读

img

所以00446D6B这个跳转不能成立

代码太多,我们直接来到函数开头一步步执行下来

img

找到函数入口点特征,对比DD发现是FormCreate的入口,根据这个名字我们不难猜测是在窗口创建时触发,这里打上断点检查触发条件,

这个时候可以把其他的断点设置为禁用,但不用删除,以备后续还需要使用

img

发现这里有一个路径,我们试着创建这个路径(为了方便这里将盘符 X 改为 D)

img

img

就可以通过第一个大跳转了

img

然后这是第二个,显示是乱码是因为编码方式不对,这里是GBK编码,更换编码后如图

img

这里容易猜测,函数调用的目的是对比文件内容,试着把这个内容写入ok.txt文件,用010Editor打开,点击hex模式然后把值复制进去

img

C++字符串保存的模式是在结尾处放一个 ‘\0’ ,这个反斜杠0的十六进制就是00,所以在00之前的都复制进来就可以了

img

然后这样就两个304的赋值语句就不会执行了,第一个判断就通过了

308

004473F7 | 81BB 08030000 0D230 | cmp dword ptr ds:[ebx+308],230D |
00447401 | 74 7C | je ckme002d.44747F |

意思是308存的这个值不能等于230D

同样地,我们搜索308的引用,点开第一条发现是初始化的语句

img

语句的排序默认是按照地址先后来的,(一般来说)也就是执行顺序

点开发现位于FormCreate事件内,是在窗口创建时执行的,可以理解为ebx+308在这里进行了初始化,赋值28E

img

那么点开第二条,根据函数入口点对比DD,发现是Button1MouseDown入口,猜测是“注册”按钮的点击事件,打下断点确认

img

因为初始值是28E,不等于230D,所以会到下一个判断 cmp cl , 1

观察发现 cl的值与鼠标点击按钮的键有关,左键(cl=0),右键(cl=1),滚轮(cl=2),原理未知,可能是某种协议规定直接写入

所以这里的意思就是,对注册按钮按下鼠标右键就会使308的值加3,暂时没有其他作用,我们接着往下看,看第5个引用处

img

img

对比DD,发现是Panel1DbClick入口,猜测是图片的双击事件,打下断点确认

img

发现并不完全是,只有在点到不是图片的部分,也就是点击空白部分才会触发(看来图片的点击是另外的事件)

00446FDC | 81B8 08030000 9D020 | cmp dword ptr ds:[eax+308],29D | Panel1DbClick入口
00446FE6 | 75 0D | jne ckme002d.446FF5 |
00446FE8 | B2 01 | mov dl,1 |
00446FEA | 8B80 F0020000 | mov eax,dword ptr ds:[eax+2F0] | eax:"TiD", [eax+2F0]:"溝A"
00446FF0 | 8B08 | mov ecx,dword ptr ds:[eax] | eax:"TiD"
00446FF2 | FF51 5C | call dword ptr ds:[ecx+5C] |
00446FF5 | C3 | ret |

可以看出,当308等于29D的时候,点击空白处会调用一个函数,对比DD会发现这个ds:[eax+2F0]的2F0是Edit2的ID

img

也就是说这里获取了Edit2的ID,并调用了一个函数,猜测可能是显示出这个Edit,毕竟目前只有一个Edit

通过右键注册按钮5次,使308等于29D,可以发现确实显示出了Edit2

至此,308结束

310

00447403 | 81BB 10030000 940F0 | cmp dword ptr ds:[ebx+310],F94 |
0044740D | 75 70 | jne ckme002d.44747F |

意思是310存的这个值要等于F94,查看引用情况,点开第一次引用,网上找函数入口点,发现为FormMouseMove入口,根据名字推测是鼠标移动触发,验证发现当鼠标进入程序界面的时候触发事件

img

这里补充一点基础知识

img

转化为文字也就是 在调用函数之前,先将两个参数(倒序)压入堆栈,再执行call,执行call时自动将返回地址压入堆栈。然后再压入ebp,mov ebp, esp,再压入局部变量

回到FormMouseMove,这两行代码很明显就是获取函数的参数

004470F6 | 8B55 08 | mov edx,dword ptr ss:[ebp+8] |
004470F9 | 8B45 0C | mov eax,dword ptr ss:[ebp+C] |

根据事件的功能推测(判断鼠标的位置),有可能是获取鼠标的坐标,尝试后确认如此

那么这些指令的意思就是判断鼠标进入程序的位置了

直到这一行,要求30C不能等于9,那么就要看30C的引用情况

img

引用第一条是30C初始化为9

img

img

所以就只有第二条能改变30C的值了,那么我们需要让第二条执行

点进去往上翻发现是Edit2DblCilick入口

img

通过一行行执行并且观察发现函数功能,如上图注释(需要耐心观察对比)

00447043 | 8078 01 5F | cmp byte ptr ds:[eax+1],5F | eax+1:"_345,78", 5F:'_'

正常来说我们常见的是dword ptr ds:[eax],他的意思是取eax这个首地址开始的一个dword(双字),所以这里byte ptr ds:[eax+1]的意思就是取eax+1这个首地址开始的一个byte,也就是一个字符,也就是edit2输入框中的第二个字符必须要为 “_”(下划线)

img

之后的0044705A同理

再往下看就是一个看不太出的函数,这里学到一点就是,实在分析不出来可以试着点进函数内部看看有没有调用什么系统Api,比如这里进入函数可以看到调用了系统API GetDiskFreeSpaceExA 一看这个API就知道估计是产生的随机数了,这个系统剩余空间估计不会有相同的返回值

img

img

img

然后就一个函数调用然后生成结果就结束了

318和314

0044740F | 8B83 18030000 | mov eax,dword ptr ds:[ebx+318] |
00447415 | 3B83 14030000 | cmp eax,dword ptr ds:[ebx+314] |
0044741B | 75 62 | jne ckme002d.44747F |

这里是要求318和314相同,进入318的引用,倒是有很多,第一行是初始化318为0

img

点进第二个,发现是Image1MouseDown入口,也就是图片【人之初】的点击事件

img

容易分析这里还是根据点击的按键对318加不同的数

其余几个都是一样,这里就不展示了

314的引用如下。第一行仍为初始化

img

后面的都是根据30C的值来对314进行赋值,相当于一个条件判断语句

img

后面就是一个对比Edit1的值是不是ajj,然后隐藏Label3

img

img

31C

0044741D | 81BB 1C030000 E7030 | cmp dword ptr ds:[ebx+31C],3E7 |
00447427 | 74 56 | je ckme002d.44747F |

意思是31C存的这个值不能等于F94

查看引用只有一条,跳转只有一行

004474C0 | C780 1C030000 E7030 | mov dword ptr ds:[eax+31C],3E7 | Button1Click入口
004474CA | C3 | ret |

验证发现鼠标右键不算Click,左键点击才算,并且如果点下去然后又移开,相当于没点

需要注意click事件和mousedown事件,click必须是鼠标左键按下和抬起的全过程,而且鼠标位置都在按钮控件范围内,不能移开。而mousedwon事件只要按下就算触发,左键右键都可以,只不过右键没有动画显示

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 [安全攻防进阶篇] 中,有关于逆向分析的教程可以帮助你了解如何使用OllyDbg逆向CrackMe程序。 OllyDbg是一种常用的逆向工具,可以用于分析和修改程序的执行流程和内存。使用内存断点和普通断点,可以在程序执行过程中捕获关键的代码位置,帮助我们找到CrackMe程序的OEP(Original Entry Point),即程序的入口点。 在 [安全攻防进阶篇] 中还有关于逆向分析两个CrackMe程序的详细教程,包括逆向分析和源码还原的步骤。这些教程将帮助你理解逆向分析的基本概念和技巧,提升你的安全能力。 如果你想深入学习如何使用OllyDbg逆向CrackMe程序,可以参考这些教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [[安全攻防进阶篇] 六.逆向分析之OllyDbg逆向CrackMe01-02及加壳判断](https://blog.csdn.net/Eastmount/article/details/107777190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [逆向crackme之ESp定律脱壳](https://blog.csdn.net/qq_58970968/article/details/125357834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值