真心好久没有开新题了,没有忘记pwn这个事情的
先说说这个题的重点在哪儿
重点在于两个地方:
A:这个是一个汇编题,与熟悉的X86的汇编语句不一样,很明显需要去查询其他汇编语言的相关知识,考验自学能力
B:关键代码在main中:
key1()+key2()+key3()) == key
key是输入的一个值,key1(),key2(),key3()都是汇编函数中的返回的固定值,那么key值是一个输入的定值,我们需要理解的就是三个函数的返回值,相加之后是我们的输入值,就搞定了
来分析三个函数吧
该汇编是ARM汇编,函数的返回值是r0,所以,只需要看与r0相关的
即逆向分析各个子程序的链,与r0有关的留下,与r0无关的不管,分析各个子程序的过程如下
分析key1():
0x00008cdc <+8>: mov r3, pc
0x00008ce0 <+12>: mov r0, r3
与r0相关的是r3,r3与pc相关
那么查询一下,pc是什么?pc指向当前指令的下两条指令的地址
所以,pc的值为0x0008cdc+0x8,所以r0也为这个值,计算得36068
分析key2():
0x00008d00 <+16>: bx r6
0x00008d04 <+20>: mov r3, pc
0x00008d06 <+22>: adds r3, #4
0x00008d10 <+32>: mov r0, r3
与key1()一样的分析逻辑
唯一不同的是多了一句bx r6(这也是一个坑点,因为我说的是与r0无关的要删掉不看)
这个意思是:切换为thumb指令,可以百度一下介绍,是arm的一个子指令集合
对做题来说,有用的是,pc在thumb指令下,指向的是当前指令的下一条指令的地址
所以,pc的值是0x00008d04+0x4,r3的pc的值+0x4,所以,r0=r3=pc+4=36108
分析key3():
0x00008d28 <+8>: mov r3, lr
0x00008d2c <+12>: mov r0, r3
key3()的重点是lr,百度一下arm lr,就知道了:放回的是key3()的返回地址
0x00008d7c <+64>: bl 0x8d20 <key3>
0x00008d80 <+68>: mov r3, r0
看到返回地址了嘛:0x00008d80=36224 所以加起来是108400
检验一下,得到flag:
加分咯,任务完成咯
附上我学习的参考链接: