真心好久没有开新题了,没有忘记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:

加分咯,任务完成咯


附上我学习的参考链接:

http://ydc1992.github.io/2016/02/15/Pwnable-kr-leg/