梦旅意中人 发表于 2020-2-11 03:21

2020春节红包之二———小白成长的血泪史

本帖最后由 梦旅意中人 于 2020-2-11 20:18 编辑



在写下此文的过程中,也多次迟疑,思考着这样的文章是否过于臃肿,期间图文排版也频频出错,更是让我想要放弃。但想到一些同我一样的毫无经验又想要学习破解的小白,在学习过程中也是会出现各种各样的错误,于是将自己的第一次完整的破解历程记录下来,希望可以给同我一样无处下手的小白一些思路,就足够了。于今日看评论区之后,甚是欣慰,各位一起加油吧!


因文章篇幅较长,有需要的同学可直接选择到文章末尾阅读简略的思路记录截图。


https://static.52pojie.cn/static/image/hrline/1.gif


时间飞逝,约一周半前看到春节红包题目上线后,回想起自己的辛酸往事,19年止步于题二,终不得解。时隔一年后,又看到题目,忍不住就想要试手。月黑风高夜,解题正时间。我启动了我那台工作多年的电脑,伴随着电脑散热风扇呼呼响起,一顿操作行云流水,题目二压缩包顺利的出现在磁盘中。看到庐山真面目后,不由乍舌,心里想着怎么看起来和去年的题目不一样呢?连个按钮都没有。随即依靠本人多年混迹各种编程语言经验猜想,一定是使用了OnChange来监听输入,便输入几个字符,反复测试,却不见一个弹出框。不由得先放下,转而使用查壳大法。


虽然界面图形有些错位,但不难发现是upx壳。在公众号推文中找到了19年红包解题的推文,希望能从中看到一些思路。正当我感叹于大佬解题思路之清晰,手法之娴熟时。不知不觉便到文末,顺手翻看了评论区,好巧不巧,看到了自己当时的留言,又想起了被upx支配的恐惧。



好在也有所收获,知道了还有IDA这样的软件,可以更方便的来调试代码,但最终因不熟悉操作被劝退。后来想到可以用OD先来脱壳,于是论坛一顿搜索,学习了esp定律脱壳。



首先把程序拖入OD中,这里选择否,等待加载完毕。



此时按一次F8,然后在右上角窗口中找到ESP,在它后面数字上右键后选择数据窗口中跟随。


可以看到这里的左下角的数据已经有了改变,选中HEX 数据下方的四个数字后右键依次选择断点—>硬件访问—>Word



此时按下F9后会发现停到了这里,继按下F8,会发现这里有一个向上的jnz跳转,



当然不能让它跳转上去了,左键点击jnz的下一行,按下F4 (这样是为了便于执行后面的代码,注意:此处可能出先按下F4后无法定位到下一行的问题,可再次重复此操作)使当前代码运行停留在jnz的下一行


此时继续F8,发现一个jmp跳转,这个跳转是一个无条件跳转,不用做改动,继续F8。


此处发现了汇编代码为push ebp,可以停下来了。这里就是程序的入口点。当然每个程序对应的入口不相同,需要结合实际情况。



现在点击调试,选择删除硬件断点(删除掉之前下的硬件断点)。



之后在刚才停下的代码上右键用OllyDump脱壳调试进程。



这里默认选择即可,注意此处复制一下入口点修正后的值(后期会用到,说多了都是泪)点击确定,便得到了脱壳后程序。



查壳后发现壳被脱掉,同时程序是由Delphi编写的。但脱壳后的程序无法打开,顿时感觉不快乐,于是又是一番搜索过后,终于发程序还需要修复一下。这里使用Import REC来修复。先运行一下最初的程序。



打开Import REC,在下拉列表中找到最初的程序 (即你下载程序所在的路径)。



在OEP中粘贴上文中提到复制的入口点修正的值 (我的此时为221B3C 加上00 即00221B3C)点击TAT 自动搜索。



点击确定后,点击获取导入表。



看到这个界面后,点击修正转储。


在弹出窗口中选择之前脱壳后无法打开的程序(我这里的是test2.exe)


看到如图所示,程序修复完成。



可以看到 Import REC 默认修复后的程序名为 xxx_.exe 注意它有下划线。总算是脱壳修复完成了,接下来就是尝试破解了,又是一番搜索过后,总算是有了些眉目。



依照惯例,先是在搜索一下字符串,将修复后的程序放入OD中,右键后选择中文搜索引擎—>搜素UNICODE(ASCII码搜索后发现有乱码 当然智能搜索也可以)



这行“请把答案回复到论坛公众号!”字符串引起了我的注意,而它上方的三行字符串似乎有种似曾相识的感觉,于是我兴奋的复制了一行去程序中检验成果,结果三行过后,没有任何的提示。于是双击当前的字符串。看看它汇编对应的位置。能不能找到一些线索




不难发现外部有一个跳转绕过了当前选择的地址,找到最上方的jnz跳转,给它下断点之后,尝试着从它的下一行调试运行,结果F4键竟然不起作用了(此处断点需文本框获取值后)无奈只得寻求新的方法。


几经波折后,想起去年有人猜出密码,于是我一顿乱猜 (happy new year!、Happynewyear2020……….)均以失败告终,
果然还是要老老实实的来,盲猜无果后,因发掘不出重要信息,我疯狂的在网上搜索,以Delphi程序为突破口,想要知道它是怎么取得字符串的,在尝试了GetDlgItemText、GetWindowText、SendMessage 等无法下断后,刚好发现这位大佬 @女萝岩 刚出炉的思路(帖子详见:https://www.52pojie.cn/thread-1095196-1-1.html),使用特征码(按下CTRL+B 调出输入框) 8D????8B83????????E8???????? 搜索定位将程序获取输入框内容的地址找了出来,在此处按下F2设置断点。看着下方不远处熟悉的jnz跳转,猜想着是不是下面的几行代码是用来做长度检验的。


加上在搜索时有发现一个名为IDR的工具,听说可以反编译Delphi程序,一番这折腾后,IDR也安排上了,同时印证了之前OnChange事件的猜想,



但反编译只得到了一小部分代码, 不过从中可以看到有个Length函数和15的字样,初步猜测输入的字符串长度应为15位。按下F9,程序运行。



于是输入了长度为15的abcdefghijklmno 字符串,在之前取值下断点的地方停了下来。



继续F8,发现了cmp eax,0xF这行汇编代码(cmp计算实质上是减法操作,它的结果会存放在右边寄存器中的Z标志位上,相等Z变为1,不相等变为0,为下方的jnz跳转做依据,若Z=1,则jnz不跳转,否则跳转),由0xF(16进制数)即15(10进制数)和前面IDR反编译看到的15可知,最终答案长度为15位。



一顿F8过后,发现输入的字符串被分割为三部分,其中长度分别为 7 (abcdefg),4(hijk),4(lmno),猜想答案应该由三部分构成,而之前那三行字符串也有出现,会不会之间有什么联系?
(此处其实已经可以算整个分析是结束了。以下蓝色字体内容为后期补充内容:




可以看到在右边的寄存器窗口内,有两行字符串,而EDX后的字符串是我们之前见过的。或许解密的关键就在此处。我们在当前的call函数上按下F7,进入内部一探究竟。





这里的代码块,是对字符串进行比较的,显然结果不一致。到这里只要知道字符串的加密方法后,逆向解密即可。)


但思路仅仅一闪而过。想起了查壳软件的界面错位,想起IDR工具报错,想起大佬们常在虚拟机中愉快的进行破解,让我怀疑是工具与win10系统的不兼容导致的,于是找到了论坛专属的虚拟机2.0,就在我苦苦等待着压缩包下载完成并将其解压后发现,虚拟机提示文件已损坏(内心顿时……)


查看了原帖了发现还有校验工具,想必是为了防止文件错误的,检测后发现确实不同于帖子中的内容,正当我准备重新下载虚拟机时,那一串MD5值引起了我的注意,MD5?MD5??为什么如此眼熟,想着我将检验用的MD5复制到记事本中,又把OD中的那三行字符串复制了一份放在一起作比较,长度相等?难道?


E7EE5F4653E31955CACC7CD68E2A7839 52pojie
ea6b2efbdd4255a9f1b3bbc6399b58f4 2019
c8d46d341bea4fd5bff866a65ff8aea9 game

但MD5的加密理论上是不可逆的,试一试吧,我将第一个出现的字符串复制下来,放到在线MD5解密的网站中,显示52pojie,1,2…….7,嗯,是它了,接着是2019和game,7,4,4 刚好15位,连起来就是 52pojie2019game,



我将结果小心翼翼地粘贴至程序输入框中,出现了一直期待着的弹窗,我无法抑制住自己的兴奋,想起了当初下载题目时那种嚣张,那种自信,那几天没有思路时硬肝到深夜,而早晨起床时那种迷茫,那种悔恨,起床后再次坐在电脑前再被题虐的体无完肤,多次想要放弃时的自己,还好坚持了下来。也算是收获不少,其实稍有经验的人,在前面的某些步骤就直接已经可以找出答案,但对于我这种天资愚钝的小白来说,还是需要多尝试的。毕竟很多东西自己摸索着得到的会印象更加深刻,写下此文也是为了给那些同我一般的小白能够获得一些解决问题的思路,能够多去尝试,终是会有收获的。


简略记录思路与总结:





内容来自本人解题的真实过程,期间各种失败,因此内容繁杂,加之第一次发布文章,难免有纰漏之处,敬请谅解。当然若有问题可在评论区留言,一同探讨。
第三题虽然看得懂java代码,但so文件最终还是没能分析出,只能后期学习大佬的思路了。

OD工具论坛中有就不上链接了

题目下载地址:https://down.52pojie.cn/Challeng ... _2020_Challenge.rar

梦旅意中人 发表于 2020-2-11 14:05

小菜鸟一枚 发表于 2020-2-11 09:15
谢谢楼主分享,我也看到了那三串字符串,F4运行不过去,在段首F2下断点,F9程序也直接跑起来了,没断下来。 ...

其实我在分析得时候也是这样,别人的思路只能借鉴,完整的解法需要自己实践才行。我在这里也卡了一两天,最后无时无刻都想放弃了,在论坛看见了特征码,才得以继续。哈哈哈哈哈,大佬真的谈不上,只能算是个小白。一起加油!

yaerhuo 发表于 2020-2-11 07:28

今年我也是和楼主一样,搜了很多文章,发现一模一样的upx手脱大法,试着脱了壳,搜到的字符串很像MD5,复制答案是错的,后来复制到公众号,终于实现了0的突破,话说64位系统不好用,真是小白的血泪成长史,话说我琢磨了几晚上还是不会用IDA,到现在也无法明白怎么会有乱码,楼主使用的工具很多我都没用过,还要向楼主多多学习

vcax 发表于 2020-2-11 04:21

感谢 楼主 辛勤劳动分享

fanjiang 发表于 2020-2-11 04:33

谢谢楼主!楼主非常nice!

s785093878 发表于 2020-2-11 06:37

很详细的解题过程,其中思路值得学习,感谢分享

sharks 发表于 2020-2-11 06:41

谢谢楼主分享啊

tqm9080 发表于 2020-2-11 08:25

非常有用.谢谢

digitalhouse 发表于 2020-2-11 08:31

太厲害了

感謝分享思路

wataxi 发表于 2020-2-11 08:39

学习了,感谢分享

@都还在吗 发表于 2020-2-11 09:02

很详细啊,感谢楼主,值得学习。{:1_927:}
页: [1] 2 3 4 5 6 7
查看完整版本: 2020春节红包之二———小白成长的血泪史