每日一题 pwnable.kr leg

  leg.asm
    (gdb) disass main
    Dump of assembler code for function main:
       0x00008d3c <+0>:	push	{r4, r11, lr}
       0x00008d40 <+4>:	add	r11, sp, #8
       0x00008d44 <+8>:	sub	sp, sp, #12
       0x00008d48 <+12>:	mov	r3, #0
       0x00008d4c <+16>:	str	r3, [r11, #-16]
       0x00008d50 <+20>:	ldr	r0, [pc, #104]	; 0x8dc0 <main+132>
       0x00008d54 <+24>:	bl	0xfb6c <printf>
       0x00008d58 <+28>:	sub	r3, r11, #16
       0x00008d5c <+32>:	ldr	r0, [pc, #96]	; 0x8dc4 <main+136>
       0x00008d60 <+36>:	mov	r1, r3
       0x00008d64 <+40>:	bl	0xfbd8 <__isoc99_scanf>
       0x00008d68 <+44>:	bl	0x8cd4 <key1>
       0x00008d6c <+48>:	mov	r4, r0
       0x00008d70 <+52>:	bl	0x8cf0 <key2>
       0x00008d74 <+56>:	mov	r3, r0
       0x00008d78 <+60>:	add	r4, r4, r3
       0x00008d7c <+64>:	bl	0x8d20 <key3>
       0x00008d80 <+68>:	mov	r3, r0
       0x00008d84 <+72>:	add	r2, r4, r3
       0x00008d88 <+76>:	ldr	r3, [r11, #-16]
       0x00008d8c <+80>:	cmp	r2, r3
       0x00008d90 <+84>:	bne	0x8da8 <main+108>
       0x00008d94 <+88>:	ldr	r0, [pc, #44]	; 0x8dc8 <main+140>
       0x00008d98 <+92>:	bl	0x1050c <puts>
       0x00008d9c <+96>:	ldr	r0, [pc, #40]	; 0x8dcc <main+144>
       0x00008da0 <+100>:	bl	0xf89c <system>
       0x00008da4 <+104>:	b	0x8db0 <main+116>
       0x00008da8 <+108>:	ldr	r0, [pc, #32]	; 0x8dd0 <main+148>
       0x00008dac <+112>:	bl	0x1050c <puts>
       0x00008db0 <+116>:	mov	r3, #0
       0x00008db4 <+120>:	mov	r0, r3
       0x00008db8 <+124>:	sub	sp, r11, #8
       0x00008dbc <+128>:	pop	{r4, r11, pc}
       0x00008dc0 <+132>:	andeq	r10, r6, r12, lsl #9
       0x00008dc4 <+136>:	andeq	r10, r6, r12, lsr #9
       0x00008dc8 <+140>:			; <UNDEFINED> instruction: 0x0006a4b0
       0x00008dcc <+144>:			; <UNDEFINED> instruction: 0x0006a4bc
       0x00008dd0 <+148>:	andeq	r10, r6, r4, asr #9
    End of assembler dump.
    (gdb) disass key1
    Dump of assembler code for function key1:
       0x00008cd4 <+0>:	push	{r11}		; (str r11, [sp, #-4]!)
       0x00008cd8 <+4>:	add	r11, sp, #0
       0x00008cdc <+8>:	mov	r3, pc
       0x00008ce0 <+12>:	mov	r0, r3
       0x00008ce4 <+16>:	sub	sp, r11, #0
       0x00008ce8 <+20>:	pop	{r11}		; (ldr r11, [sp], #4)
       0x00008cec <+24>:	bx	lr
    End of assembler dump.

返回值为r0.
mov r3,pc 再mov r0,r3 即把pc的值作为返回值

PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:1.取指(从存储器装载一条指令);2.译码(识别将要被执行的指令);3.执行(处理指令并将结果写回寄存器)。
##一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。
##当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;

key1=r0=0x8cdc + 0x8 = 0x8ce4

(gdb) disass key2
Dump of assembler code for function key2:
   0x00008cf0 <+0>:	push	{r11}		; (str r11, [sp, #-4]!)
   0x00008cf4 <+4>:	add	r11, sp, #0
   0x00008cf8 <+8>:	push	{r6}		; (str r6, [sp, #-4]!)
   0x00008cfc <+12>:	add	r6, pc, #1
   0x00008d00 <+16>:	bx	r6
   0x00008d04 <+20>:	mov	r3, pc
   0x00008d06 <+22>:	adds	r3, #4
   0x00008d08 <+24>:	push	{r3}
   0x00008d0a <+26>:	pop	{pc}
   0x00008d0c <+28>:	pop	{r6}		; (ldr r6, [sp], #4)
   0x00008d10 <+32>:	mov	r0, r3
   0x00008d14 <+36>:	sub	sp, r11, #0
   0x00008d18 <+40>:	pop	{r11}		; (ldr r11, [sp], #4)
   0x00008d1c <+44>:	bx	lr
End of assembler dump.

r6=0x8cfc+8+1=0x8d05,此时bit[0]为1,所以接下来是thumb指令,每个指令两个字节。
bit[0]是指r6的二进制情况下的最低位,也就是最右边一位。bit[0]为1.
在这里插入图片描述
r3 = 0x8d04+4+4(两个thumb指令,每一个4个字节)
在这里插入图片描述
r3 = pc +4,pc的值指向当前指令下一条的地址,即pc=pc+4
r3 = pc +8=0x8d04+0x8
r0 = r3 = 0x8d0c 即key2 = 0x8d0c

thumb指令 :
    bx的语法格式:
    bx{}<Rm><cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。<Rm>该寄存器中为跳转的目标地址。当寄存器的bit[0]为0时,目标地址处的指令为ARM指令;当寄存器的bit[0]为1时,目标地址处的指令为Thumb指令。
(gdb) disass key3
Dump of assembler code for function key3:
   0x00008d20 <+0>:	push	{r11}		; (str r11, [sp, #-4]!)
   0x00008d24 <+4>:	add	r11, sp, #0
   0x00008d28 <+8>:	mov	r3, lr
   0x00008d2c <+12>:	mov	r0, r3
   0x00008d30 <+16>:	sub	sp, r11, #0
   0x00008d34 <+20>:	pop	{r11}		; (ldr r11, [sp], #4)
   0x00008d38 <+24>:	bx	lr
End of assembler dump.
(gdb) 

r0 = lr,lr保存返回地址,返回到main函数
在这里插入图片描述
main函数执行到0x8d7c时,跳转到key3.然后Key3执行完了之后,返回地址应该是0x8d80.
r0 = 0x8d80 即key3 = 0x8d80
key = key1+key2+key3 =0x8ce4+0x8d0c+0x8d80 =108400
flag:My daddy has a lot of ARMv5te muscle!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值