워게임/CTFlearn

[CTFlearn] RE_verseDIS - 리버싱 / IDA / Python

SecurityMan 2023. 3. 3. 11:00

 

CTFlearn 의 일흔 여섯번째 문제

 

이번엔 Medium 난이도의 리버싱 문제이다.

 

숨겨진 비밀번호를 찾으라고 한다.

 

반응형

 

 

문제에서 주어지는 것은 problem 파일이다.

 

 

리눅스 환경에서 시험삼아 실행시켜 보았다.

 

비밀번호를 입력받는데

 

test 라고 입력했더니 틀린 비밀번호라는 문구가 출력된다.

 

 

바로 IDA 라는 디스어셈블러를 이용해 problem 파일을 열고,

 

F5를 눌러 main 함수의 수도코드를 살펴보았다.

 

key 배열에 들어있는 값을 key2 배열로 옮겨서 집어넣고,

 

msg 배열에 str[4 * 1] ^ LOBYTE(key2[i]) 의 결과값을 집어넣는다.

 

그리고 사용자의 입력값이 msg 배열과 같은지 검증하고 있다.

 

 

key 배열에는 IdontKnowWhatsGoingOn 라는 값이 들어있고,

 

 

str 배열에는 이런 값이 들어가 있다.

 

조금 보기 불편한데

 

 

hex 값으로 보면 이런 값이 들어가 있다.

 

문제 푸는 방법은 간단하다.

 

저 수도코드를 그대로 파이썬으로 옮겨 작성한 후,

 

결과값을 출력시켜 보면 된다.

 

import binascii

key = b'IdontKnowWhatsGoingOn'

str1 = [0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00,
0x32, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x45, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x0D, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00,
0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

msg = []

for i in range(21):
	msg.append(str1[4*i] ^ (key[i] & 0x00FF))
	
for j in range(len(msg)):
	print(chr(msg[j]),end='')

 

코드는 이렇게 작성할 수 있다.

 

수도코드에 있는 LOBYTE 는 

 

python에서 & 0x00FF 와 같이 구현할 수 있다.

 

근데 사실 이 문제에서는 아무 의미없는 연산이다.

 

 

코드를 실행시키면 숨겨져 있던 비밀번호를 찾을 수 있다.

반응형