WARGAME/hack ctf

Random Key

raar 2020. 3. 19. 02:40

 

 

 

이번 문제는 다음과 같다. 먼저 실행을 시켜 보면,

 

 

 

 

인증 프로그램 컨셉으로 입력을 받게 된다. 그 후 "Nah..."이라는 문자열이 출력이 되고 종료가 된다. 바로 ida로 분석을 해보면,

 

 

 

 

v5 변수에 rand 함수로 난수값을 넣고 입력으로 받은 v4 랑 비교하여 같을 경우 system 함수가 호출된 다. 여기서 우리는 srand가 time 함수를 통해 seed 값을 얻어오는 방식을 역 이용할 수 있다. 원래 rand 함수로 얻어오는 랜덤 값은 몇 번을 실행 하든 동일 하지만 srand와 time 함수로 매 시간마다 다른 seed 값을 받아와 매번 실행할 때마다 다른 랜덤 값이 나온다. 즉, 똑같은 타이밍에 얻어오는 seed 값으로 random 값을 생성하면, 똑같은 값이 나올 것이다. 

 

 

 

 

우선 다음과 같이 srand, time, rand 함수를 한 번씩 사용하는 c 프로그램을 짠 뒤 .so 라이브러리 파일로 컴파일 한 다음

python의 ctypes 라이브러리를 사용하여 컴파일 한 .so 파일을 연동하여, random 값을 만든 다음 문제 바이너리에서 만든 random 값과 비교하면 참이 될 것이므로 system 함수가 호출될 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
from ctypes import*
from pwn import*
 
= remote("ctf.j0n9hyun.xyz"3014)
#p = process("./random")
libc = CDLL("./libc.so")
 
data = libc.rand()
 
p.sendline(str(data))
 
p.interactive()

 

 

 다음과 같이 직접 만든 공유 라이브러리를 연동하고 필요한 c 함수들을 호출하여 random 값을 생성하고 sendline으로 보내면 flag를 얻을 수 있다.

 

 

 

FLAG : HackCTF{5087686686858549173307745189}