pwnable.kr [leg]

pwnable.kr [leg]

Daddy told me I should study arm.
But I prefer to study my leg!
Download : http://pwnable.kr/bin/leg.c
Download : http://pwnable.kr/bin/leg.asm
ssh leg@pwnable.kr -p2222 (pw:guest)

才学完x86又要学ARM
直接贴汇编

(gdb) disass main
Dump of assembler code for function main:0x00008d3c <+0>:	push	{r4, r11, lr}0x00008d40 <+4>:	add	r11, sp, #80x00008d44 <+8>:	sub	sp, sp, #120x00008d48 <+12>:	mov	r3, #00x00008d4c <+16>:	str	r3, [r11, #-16]0x00008d50 <+20>:	ldr	r0, [pc, #104]	; 0x8dc0 0x00008d54 <+24>:	bl	0xfb6c 0x00008d58 <+28>:	sub	r3, r11, #160x00008d5c <+32>:	ldr	r0, [pc, #96]	; 0x8dc4 0x00008d60 <+36>:	mov	r1, r30x00008d64 <+40>:	bl	0xfbd8 <__isoc99_scanf>0x00008d68 <+44>:	bl	0x8cd4 0x00008d6c <+48>:	mov	r4, r00x00008d70 <+52>:	bl	0x8cf0 0x00008d74 <+56>:	mov	r3, r00x00008d78 <+60>:	add	r4, r4, r30x00008d7c <+64>:	bl	0x8d20 0x00008d80 <+68>:	mov	r3, r00x00008d84 <+72>:	add	r2, r4, r30x00008d88 <+76>:	ldr	r3, [r11, #-16]0x00008d8c <+80>:	cmp	r2, r30x00008d90 <+84>:	bne	0x8da8 0x00008d94 <+88>:	ldr	r0, [pc, #44]	; 0x8dc8 0x00008d98 <+92>:	bl	0x1050c 0x00008d9c <+96>:	ldr	r0, [pc, #40]	; 0x8dcc 0x00008da0 <+100>:	bl	0xf89c 0x00008da4 <+104>:	b	0x8db0 0x00008da8 <+108>:	ldr	r0, [pc, #32]	; 0x8dd0 0x00008dac <+112>:	bl	0x1050c 0x00008db0 <+116>:	mov	r3, #00x00008db4 <+120>:	mov	r0, r30x00008db8 <+124>:	sub	sp, r11, #80x00008dbc <+128>:	pop	{r4, r11, pc}0x00008dc0 <+132>:	andeq	r10, r6, r12, lsl #90x00008dc4 <+136>:	andeq	r10, r6, r12, lsr #90x00008dc8 <+140>:			;  instruction: 0x0006a4b00x00008dcc <+144>:			;  instruction: 0x0006a4bc0x00008dd0 <+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, #00x00008cdc <+8>:	mov	r3, pc0x00008ce0 <+12>:	mov	r0, r30x00008ce4 <+16>:	sub	sp, r11, #00x00008ce8 <+20>:	pop	{r11}		; (ldr r11, [sp], #4)0x00008cec <+24>:	bx	lr
End of assembler dump.
(gdb) disass key2
Dump of assembler code for function key2:0x00008cf0 <+0>:	push	{r11}		; (str r11, [sp, #-4]!)0x00008cf4 <+4>:	add	r11, sp, #00x00008cf8 <+8>:	push	{r6}		; (str r6, [sp, #-4]!)0x00008cfc <+12>:	add	r6, pc, #10x00008d00 <+16>:	bx	r60x00008d04 <+20>:	mov	r3, pc0x00008d06 <+22>:	adds	r3, #40x00008d08 <+24>:	push	{r3}0x00008d0a <+26>:	pop	{pc}0x00008d0c <+28>:	pop	{r6}		; (ldr r6, [sp], #4)0x00008d10 <+32>:	mov	r0, r30x00008d14 <+36>:	sub	sp, r11, #00x00008d18 <+40>:	pop	{r11}		; (ldr r11, [sp], #4)0x00008d1c <+44>:	bx	lr
End of assembler dump.
(gdb) disass key3
Dump of assembler code for function key3:0x00008d20 <+0>:	push	{r11}		; (str r11, [sp, #-4]!)0x00008d24 <+4>:	add	r11, sp, #00x00008d28 <+8>:	mov	r3, lr0x00008d2c <+12>:	mov	r0, r30x00008d30 <+16>:	sub	sp, r11, #00x00008d34 <+20>:	pop	{r11}		; (ldr r11, [sp], #4)0x00008d38 <+24>:	bx	lr
End of assembler dump.
(gdb) 

程序逻辑为输入key1,key2,key3,三个函数的和即可。
需要知识如下

在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。

在ARM的伪指令中,CODE16(thumb),CODE32(ARM)的作用是告诉编译器后面的指令类型

PC指向当前指令的下两条指令的地址

r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。
意思:以上三个函数的返回值都在r0

4、 BX 指令
BX 指令的格式为:
BX{条件} 目标地址
BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。

key1

观察代码发现以下语句

   0x00008cdc <+8>:	mov	r3, pc0x00008ce0 <+12>:	mov	r0, r3

因为r0为函数返回值,所以函数的返回值为pc,

pc指向当前指令下两条指令的地址

pc值为0x00008cdc+0x8

key2

观察以下语句

0x00008cfc <+12>:	add	r6, pc, #1
0x00008d00 <+16>:	bx	r6
0x00008d04 <+20>:	mov	r3, pc
0x00008d06 <+22>:	adds	r3, #4
0x00008d10 <+32>:	mov	r0, r3

可得r0的值为r3r3的值为pc+4,但是bx命令跳转为thumb模式,pc此处+2,最终值为0x00008d04+4+4

key3

经过前两个的提示,这个就很简单了,r0的值为lr的值。

LR的特殊用途有两种:一是用来保存子程序返回地址

查看返回地址为0x8d80
加起来即为答案

0x1A770(108400)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部