본문 바로가기

Pwnable/HackCTF

[ProjectH4C] HackCTF (Offset)

 

Offset의 코드는 다음과 같다.

 

main 함수

 

 

select_func 함수

 

 

one 함수

 

 

 

two 함수

 

처음에 Which function would you like to call? 이란 메세지가 출력된 후 입력을 받는다.

이후 입력 값을 select_func 함수의 인자로 넘겨서 실행시킨다. 만약 입력 값이 one 이라면 one 함수를 실행하고, 그렇지 않으면 two 함수를 실행시키는 듯 하다. 

조금 더 살펴보면 offset에는 위의 함수 뿐 아니라 print_flag 함수도 존재한다.

 

 

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()