您的位置:首页 > 其它

[Toddler's Bottle]-[leg]

2016-07-25 21:16 246 查看
真心好久没有开新题了,没有忘记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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pwnable ARM汇编