CTF/리버싱

[2020CCE] My Friend - 리버싱 / IDA / Python

SecurityMan 2022. 11. 1. 11:00

 

2020년에 진행되었던 국정원 주최 사이버공격방어대회

 

묵혀놨던 Write Up을 이제야 포스팅 해 본다.

 

반응형

 

이번에 포스팅 할 문제는 My Friend 라는 제목의 리버싱 문제이다.

 

 

주어지는 파일은 mf 라는 이름의 바이너리 파일이다.

 

 

리버싱 카테고리에 있는 문제고, 

 

알 수 없는 바이너리 파일을 받았으니 바로 IDA 라는 디스어셈블러를 이용해 열어보았다.

 

IDA에서 인식하길 해당 파일은 Mach-O 파이라고 한다.

 

Mach-O 파일은 애플의 MacOS 에서 동작하는 프로그램이다.

 

개인적으로 CTF에서 Mach-O 파일이 나오는걸 이때 처음봤다.

 

 

IDA로 분석해보면 함수가 친절하게 이거밖에 없다.

 

그중 _main 함수와 _get_flag 함수가 눈에 띈다.

 

 

_main 함수의 내용이다.

 

별 내용이 없다.

 

사용자에게 전달받은 인자의 갯수를 확인하고

 

printf 로 출력하는 기능이 전부이다.

 

 

_get_flag 함수의 내용이다.

 

qmemcpy 를 이용해서 v2 변수에 알수 없는 이상한 값(llj=?=?tfknPf|PbvPi}fjakr)을 담고 있다.

 

그리고 나서 for 문으로 v2 변수에 담겨있는 값을 앞에서부터 한글자씩 가져와서

 

0xF(15) 와 XOR 연산을 한 결과를 printf 로 출력시켜 주고 있는 모습이다.

 

v2 = "llj=?=?tfknPf|PbvPi}fjakr"

flag = ""

for i in range(len(v2)):
    flag += chr(ord(v2[i]) ^ 0xF)

print(flag)

 

파이썬을 이용해 간단하게 계산할 수 있다.

 

IDA에 써있는 내용을 그대로 파이썬 코드로 옮겨주면 된다.

 

 

코드를 실행시키면 플래그를 찾을 수 있다.

 

f = open('mf', 'rb')
mf = f.read()
flag = ''

for i in range(len(mf)):
    flag += chr(int(mf[i]) ^ 0xf)

print(flag)

 

이런식으로 할 수도 있다.

 

어차피 v2 배열에 들어가는 llj=?=?tfknPf|PbvPi}fjakr 라는 값이 바이너리 어딘가에 있기 때문에

 

바이너리 전체를 rb로 읽어들여서 XOR 해버리는 것이다.

 

 

아까보다 조금 보기는 힘들지만

 

cce2020{} 이라는 플래그 포맷을 알고 있기때문에 

 

금방 찾을 수 있다.

반응형