好友
阅读权限 10
听众
最后登录 1970-1-1
梦旅意中人
发表于 2022-2-16 15:17
本帖最后由 梦旅意中人 于 2023-1-24 17:42 编辑
工具在论坛的爱盘里均可下载
吾爱专用虚拟机2.0
IDA7.5
查壳
拖入PEID查壳发现未加壳直接进行下一步(可以看出程序由C/C++使用VC++6.0编写)
动态追溯
获取信息
首先我们先打开我们的程序,随意输入字符串,看看有什么提示信息(此处我输入123456),提示Error, please try again,记住这句话,待会我们会用到
OD动态跟踪
拖入OD
此时程序暂停,我们点击图中所示按钮或按F9使程序继续运行,出现我们熟悉的页面
此时最小化窗口,右键依次选择中文搜索引擎—>智能搜索
找到我们的的字符串窗口,按CTRL+F搜索我们之前找的 "Error, please try again"
双击这一行内容,回到我们的主界面,可以看到我们当前行的上面有一个向下的je跳转,在往上看可以看到 cmp eax,0x17,这需要我们有一点点的汇编知识,cmp eax寄存器和0x17的值是否相等,而0x17为16进制数字,即0x17 = 1 * 16+7 = 23,由此我们不难知道最终password的长度为23。
我们在cmp和je这两行下断点(双击汇编代码前区域或按F2),使用测试数据"11111111111111111111111",此时看到断点处停下,和我们的预想的一致,如果仔细观察,可以发现最终的答案已经在我们的右下角出现
那么到这里就已经差不多结束了,当然我们可以一路F8,看到我们熟悉的Success,不过不要着急,我们发现有一个jnz的跳转,jnz上有一个test eax,eax,再往上发现一个call函数,这里便是解题的关键了,我们再call函数处打上断点,这次我们按F7进入函数内一探究竟
进入函内部,我们继续一路F8,然后又看到我们熟悉的password了,我们输入的"11111111111111111111111"与"2022HappyNewYear52PoJie"进行cmps(字符串比较操作)
继续一路F8,从call函数出来后,使用test eax,eax 此时我们的eax值为FFFFFFFF,即-1,而jnz需要为0才能进入Success,因此答案与我们之前分析的一致
验证答案
静态分析
我们再使用IDA分析一下我们的程序
拖入IDA,点击OK
在主界面我们可以使用右键拖动窗口,或使用滚轮缩放画面大小,可以看IDA使程序执行的过程看起来更加清晰,我们很容易能看到需要函数的执行走向,快速定位函数地址
有时候可能也会收获一些意外的惊喜,比如将鼠标悬停在这个HappyNewYear!上再滑动鼠标滚轮,我们可以得到一个tips:Congratulations,there is a tip: flag length is 0001 0111,这也许是官方给我们埋的彩蛋
我们点击HappyNewYear!字符串后,可以顺势找到源头
不过这种方法似乎太欧皇了,不是谁都可以这么容易找到的,我们可以按 shift+F12 快捷键调出字符串窗口,然后同样可以找到对应的字符串,双击后也可以到达上图的位置。
这句话的意思是,祝贺,这是一个提示,flag的长度为23,为什么是23呢,0001 0111为二进制字符串,0001 0111 = 1 2^4+0+1 2^2 + 1 * 2 ^ 1 + 1 = 23, 还不太熟悉的同学可以通过百度二进制数转十进制来补补课(注:OD里面的字符串搜索也可以看到这个tip)
既然知道长度为23了, 我们便可以直奔主题了,打开我们的主界面,发现关于Success的函数判断模块
我们可以按 F5 将汇编转为伪C语言代码,出现弹窗点击OK即可,分析不难发现我们的Success与否,与这个sub_402B70函数的返回值有关,可能有人觉得看不懂,没关系,且听我细细分析。
点击这个sub_402B70函数,进入函数内部,发现最终返回一个result,这个值是我们需要重点关注的,再往上可以看到memcmp函数赋值给result,而它是用于比较字符前 v7 值是否相等,我们可以给他打上断点看看它做了什么,选择Local Windows debugger,在行号前点击出现断点,我们运行程序
输入我们的测试字符串"11111111111111111111111",回车,如果与我的界面不同, 按下F5即可
鼠标悬停在v9,a4,v3分别看到 "11111111111111111111111","2022HappyNewYear52PoJie”,“0x17”,这三个都是老演员了,我们记住这个v4,它是这个函数的第四个参数,继续F8可知result值为-1,虽然对result进行取反操作,但C语言中bool类型除0之外皆为true,因此返回了-1,回到我们的sub_402B70中,发现我们的v4对应了上面变量v7的值,我们打上断点,运行
双击v7变量,按住鼠标左键选择到这个0的前面停止
右键图中操作或按 A 将字符数组转为字符串
获得password
验证答案,没得问题。
以上内容均是通过学习论坛内外相关知识所得,所以大家没有解出来的话不用灰心,可以照我的步骤走一遍,体验一下解题的快乐。新的一年祝各位坛友身体健康,学习进步,工作顺利,万事如意,希望吾爱论坛越来越好!
我好懒,还有第三题的过程没写,抽空再写吧。
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。