大过年的,我的逆向学习群里有几个卷王不过春节,居然在那里玩什么破解题目,一开始我还没注意,专心在家炸金花,后来发现玩的人越来越多,探讨氛围越来越浓,我也来了兴趣。
一了解才知道,原来是吾爱破解论坛搞了个春节解题领红包的活动。群里有小伙伴卡住了逆不动向我求助,于是我花了点时间研究了一下。没想到还挺有意思
首先下载到这个题目的程序来运行一下,提示需要输入一个密码,先随便输入一个试试,不出所料,打印了一个Error退出了。
来,大型伺候,祭出逆向分析神器IDA,看看它有多少斤两。
IDA自动分析出了main函数, 先来大体浏览一下main函数的结构。从这些字符串信息看得出来,整个判断逻辑还是比较清晰简单的。
这里是第一处比较和判断,如果判断不通过,跳到红线的分支,直接打印Error信息。否则顺着绿色的线来到下一个代码块。
然后这里执行了一些操作之后,又继续比较判断,如果判断不通过,顺着这里的绿线,打印一个Wrong信息。
就这样一层层的校验判断,就能最终通向成功的地方,这里打印一个Success字符串!
如果仅仅只是想让程序打印出Success字符串,我们可以一路修改条件跳转指令的标志位来实现,也就是暴力破解,这个我们之前的视频里已经给大家演示过。但这道题目是要输入正确的flag,光打印Success是没有意义的,所以还得分析出正确的flag才算是破解这道题目。
好吧,看汇编指令总是让人头大,祭出IDA的大招,F5大法,反编译出C语言。
这一晃眼,也看不太出来是怎么个逻辑。
不过我注意到了这里这个函数调用,在访问全局的变量。
点进去发现这是一个字符串,大胆猜想,这个字符串肯定与我们要的flag有关系!它可能被加了密!
然后一不小心,我瞅见了这个字符串旁边还有一个字符串,这里居然有一段提示,告诉我们破解的方法就是
凯撒密码
!
凯撒密码是一种很古老也很简单的密码,简单来说,它是把明文中的字母按照字母表上向前(或向后)按照一个固定数目进行偏移后替换成对应的字符,所有字符替换完成后就得到了密文。
这个加密强度非常低,也没有秘钥,只要知道了这个偏移值,就能还原出来了。
结合刚刚的这个加密字符串,和这个提示信息,我自然而然的想到,那这个字符串肯定就是移位后的结果。
我的第一反应是想着写个程序去暴力尝试,对这个加密后的字符串通过各种不同的偏移值去还原,全部打印出来,然后根据打印出的结果,去人工筛选出最有可能的那一组来。因为真正的那个字符串肯定里面是一些有意义的单词,根据这个特征就能筛选。
于是我打开IDE,准备来编码,工程才刚建了一半,我突然想到,为啥不让AI来试试呢?
于是我打开了GPT4.0,把这个字符串给了它,并告诉它,这个字符串可能是凯撒加密的结果,让它给我推导出可能的原始明文。
几秒钟的时间,它还真给我分析出来了。这个偏移就是3,所有字符向前移动3位,得到的字符串里面就有有意义的字符串!
我赶紧拿着这个字符串试了一下,没想到居然还是给我报Error!
但这个字符串怎么看都长得像是flag。然后我凭借之前打CTF的经验,flag的格式,最后这里应该还有一个右花括号。我加了一个右花括号,又尝试了一次,嘿,这一次成功了,打印了Success!
不过我还是好奇,这个flag怎么就少了一个字符呢?凯撒加密不会改变长度啊!
于是我重新在IDA中打开了那个字符串。没想到在字符串的后面还有一个字节0x80。
因为它已经超出了ASCII字符的范围,IDA在分析字符串的时候,把它给漏掉了。而0x80向前移动三位,刚好就是右花括号!真的坑爹啊!
到这里为止,这道题目就算是破解成功了!GPT真的香啊,日常工作辅助真是个好帮手!
不过这样就破解了,总感觉有点偷奸耍滑的味道,假设没有那个提示的情况下,我们又怎么拿到flag呢?
接下来我们就来正式分析一下这道题目。
首先,我们看一下这第一个地方的判断跳转,看看这里是在判断和比较什么
我们使用WinDbg打开这个程序
我们在这第一个跳转前的判断指令这里下个断点,然后运行一下。
程序现在提示需要输入,我们随便输点啥,比如我输入一个xuanyuan,回车!
程序中断到了我刚才的断点,这里是在拿ebp-18h这个地址处的值和24h,也就是十进制的36来比较。
来看一下ebp-18h处的内存数据现在是什么。可以看到,这里是8,注意是小端字节序。
我们再往前看看,我们刚刚输入的字符串就在这附近。而8刚好就是我输入字符串的长度。难道这个位置是一个字符串长度的变量?