[Reversing.kr] ransomware

컴컴한해커·2025년 1월 14일

Reversing.kr

목록 보기
4/4

이번 문제는 reversing.kr에서 120점인 나름 나에게는 도전적(?)인 문제를 시도해보았다.

📌 사전 분석

말투가 나쁜 사람치고는 착한 어투(?)로 쓴 것 같다. 문제는 key값을 입력하고 이 key값을 이용하여 복호화를 하는 문제인 것 같다.
일단 PE File Format을 확인하였다.

upx로 패킹되어 있는 파일이다.


📌 코드 분석

시작부터 pushad가 나오는 데 이는 upx로 되어 있기 때문에 그런 것이다. 이에 대응 하는 popad를 찾아서 OEP로 진입해보겠다.

여기가 OEP인 것 같다. OEP에서 무작정 코드를 분석하는 것보다 우리의 목적은 File을 복호화 하는 것이 목표이므로 File과 관련된 함수가 쓰였는지 확인해 보겠다.


fopen, fclose와 같은 File과 관련된 함수가 사용되었다. 해당 부분으로 가서 코드를 분석하면 빠르게 분석이 가능할 것이다. 일단 key값을 입력받는 scanf로 가서 BP를 걸고 달려보겠다.


scanf 이후로 쭉 달리다 보면 암호화와 관련된 코드가 보인다. 5415B8에 있는 값과 44D370에 있는 값을 xor하여 값을 한 번 구하고 그 값을 FF와 한번 더 XOR을 진행한다. 이제 복호화 알고리즘을 알았다. XOR의 특성 상 XOR을 한번 더 하면 원래의 값으로 돌아온다.
Encrypted -> XOR key -> XOR FF -> Decrypted 이니까 Decrypted -> XOR FF -> XOR key -> Encrypted가 될 것이다. 문제는 우리는 Key값을 구하기 위해선 Encrypted와 Decrypted를 둘 다 알아야 한다.
힌트는 readme.txt에서 구할 수 있다. Decrypt File(EXE)라고 적혀있는 걸 통해 File은 EXE인 것을 알 수 있다. 따라서 PE Dos Header가 MZ로 시작할 것이다. 이 부분을 이용해서 key값을 구한다.

exe='4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00'
encrypted_exe='DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93'
flag =''

exe = exe.split(' ')
encrypted_exe=encrypted_exe.split(' ')

for i in range(len(exe)):
	flag += chr((int(encrypted_exe[i], 16) ^ 0xff) ^ int(exe[i], 16))
print(flag)

이 코드를 이용하면 다음과 같은 key값이 나온다.

이 값을 이용해서 run.exe의 key값에 입력하면 file이 PE file format 형식으로 나올 것이다.
따라서 돌린 후 이 file을 exe 형태로 변환 후 진행하면 값이 나온다.


이 문제의 교훈 : 무작정 코드 분석을 했다가 파일 관련 함수를 그냥 건너뛰길래 뭔가 이상하다 했다. 닥치고 머리 박지 말고 가능성을 염두에 두고 문제를 풀어야 겠다.

0개의 댓글