0x00 序
细细算一下貌似也的确是有一段时间没写博客了,一方面是真的感觉没什么东西想写,另一方面也是因为。。。(算了就是因为懒
题目来源你校题库,zsctf2018 RE_喜闻乐见
应三线之邀给他讲这么一个睡前小故事。
0x01 致三线
其实拿到题目我们首先可以从题目外分析一下,题目名称是cmp.exe。那么它为什么要以cmp命名呢?答案很显然CenFun Music Player,说明出题人很喜欢听歌其实但凡写过代码,应该都见过函数名称包含cmp的函数,这些函数大多起到比较不同变量的作用。所以我们也可以大胆的猜测一下,这程序里面大致的处理逻辑,应该也就是你输入一串字符之后在里面和程序已有的字符串进行比较,通过了,皆大欢喜,flag你拿到了,通不过愣着干什么爆破啊,好了这题讲完了
这就是题目的样子,其实这也从侧面印证了,刚刚从题目名称得出的猜测。
0x02 晚安
下面我们将程序载入到ida
可以很清楚的看到ida已经帮你自动定位到main函数了,ida开始汇编是默认以流程图形式显示,对梳理程序大致逻辑帮助很大,但这题用处不大,或者说我不喜欢看流程图模式。(大雾
好,三线下面跟着我敲一下空格,你会惊喜的发现,汇编会从流程图模式转变为地址顺序模式,这样看着是不是就舒服多了(反正我是这么觉得
之后我会介绍IDA中一项神一样的功能,按一下F5,你的Hexray插件就会将x86汇编转变成伪c代码的格式(这也导致了这个插件卖的比ida本身还贵),当然tab也是可以做到在伪c和汇编之间切换。
不过,在这里还是要强调一下,idaf5转出来的是伪c代码,是不能直接copy运行的,另外对于一些特殊的逻辑f5插件转伪c代码是会识别错误,或者干脆无法转成伪C代码(例如你校题库那道200分的maze)。现在看着这转出的伪c代码这个程序逻辑就很清晰了。
strcopy函数将字符串zrawb{{xy~z^qpwsr]
gcba~`放入局部变量str中
scanf将你输入的字符串放入局部变量str2中
strlen获得字符串str的长度
在下面的for循环中用1~5来回对字符串str进行异或操作直到结尾
之后将你输入的str2与已经被处理过的str进行比较,相等则输出got!this is flag\n,而你所输入的便是这道题的flag
分析到这所有的一切就都很清楚了,只求出被那个for循环处理过的str字符串便可以得到flag了。所以自己写个程序照那个逻辑执行输出一下,这题就出了,当然你也可以用ida直接动态调试,执行过去,看看str里的数据也可以颇为省事的得到flag。
至于ida动态调试步骤,按f9,或者点击ida上方的Debugger,选择调试模式就会出现这样的界面
我想你们ida都是装在windows下的,所以选择第三个在本地windows下调试就好。至于那些linux或者mac大佬们,开个Windows虚拟机远程调试,请。(对了三线昨天说,明年他就有mac用了,请各位到时候提醒我问他,“三线哥哥,你的mac呢”。
之后关于动态调试的快捷键也就和平时用到ide差不多了
F2下断点,F4执行到光标所在行,F8步过,F7步入,F9继续执行直到下一个断点处。
我们是要看str在循环处理后的内容,所以直接把断点打在while那行上,按f9让程序跑起来(动态调试时窗口结构自己调整,怎么舒服怎么来嘛,还有第一次调试时汇编框依然会以流程图模式出现,但还是可以按空格进行切换),在黑框框里随编输点什么。如果到现在我写的都看懂的应该知道输入是对str没什么影响的。
好,输入,回车,你会发现程序已经断在断点那里了。之后你点击str变量就可以看到此刻栈中它的内容了。ida第一次查看栈内容默认是按字节排列的,可以按一下a键或者鼠标右键第五个,ida就会帮你把相应位置能整合成字符串的整合成字符串了。(这个地方可能描述的不太好,操作一下就能明白我意思了
当然图片中原本有flag的地方已经被我贴心的截掉了,毕竟好的故事向来都是要留点悬念的。
讲完了,散场吧,该复现的去复现,这毕竟是我讲。不留flag也是不希望有人到这里直接拿了flag去交,为了那10分不至于。如果真想要分,可以对我说,我去后台给你个ak。(我倒要看看有几个人对我这么说,我怕不是去后台当场删号
0x03 好梦
睡梦里故事仍在继续