这第2个拆弹过程有点上头了,思路不太好,不过在此记录一下过程。
老样子gdb list出来后先看看phase_2的汇编代码
看到read_six_numbers,我想到的是一个寄存器读取了一个6位的数字进行比较,那就不说了先试试一个六位数的
结果一通乱试没一个reg有特殊数字的说明想的不对,那就搞个断点看看这个函数是啥
打个断点一看寄存器里面,有6个%d,这是c语言的占位符,结合名字感觉像是要6个数字。不过我还是想试试是不是就只是这个字符串"%d %d %d %d %d %d",试试
证明我想多了,果然不是那就是6个数字,先来一串简单的试试
用111 222 333 444 555 666这种到时候一眼就能看出来的值,继续断点进去看
看到这个cmpl $0x1,(%rsp) ,然后我查看了一下我这里的值是不是1
哦是我输入的第一个值那接下来就是booooom了。既然这样,那我就把数字改成1 2 3 4 5 6 试试
走了几步发现好像一直能过,于是直接continue一下,发现boom了,于是回头继续找问题。看了下,2是可以过的
2能过然后我这里没太多想就一直ni了下去,突然发现了rax变成4了
其实就在这几步里一直loop,但我没有去分析这个loop逻辑。要是早点分析一下应该会早点pass。不过这都是马后炮了。
看到这个4,我以为是我123过了,跳到了第四个数4这里,于是一看($rbx)
居然是3,那我寻思这数字就是1 2 3 3 x x ?
立马一拍大腿,这种有规律的肯定就是1 2 3 3 2 1啊,肯定!
上然后boooom。
这就纳闷了,确定了1 2 3 3,后面先继续用5 6去调试看看情况吧
然后一步步走,走到这出来个4,我才发现好像不对劲
我输入应该没有4才对,那说明这个4是true answer,我前面的推断有误。检查了一下前面的思路,发现应该不是1 2 3过了,应该是1 2 过了,第三个数是4,才对。
既然是1 2 4 ,又有规律,立马想到等比数列,试试!
这次一步步继续往下,走到4过了,8出现也过了,我就基本确定是这样了
结果没错,就是等比数列。
虽然这个汇编代码没太分析明白,不过还是去对应找出了相关知识点再去看看学习。
拆弹2实验就到这了。
网友评论