-
[reversing.kr] ransomware 풀이Wargame/reversing.kr 2021. 1. 8. 17:19
1. 프로그램 분석
프로그램을 다운로드하여 압축을 풀면 다음과 같이 세 가지 파일이 있는 것을 확인할 수 있다.
우선 readme.txt를 열어보자.
file을 decrypt하라고 한다. 이제 run.exe를 실행시켜보자.
file이 암호화 되어 있고 적절한 key를 입력하면 해당 key 값으로 파일을 복호화하는 구조의 프로그램인 것 같다.
위와 같이 임의의 키를 입력하였을 때 위와 같은 문구가 출력된다. 과연 파일이 복구되었는지 file에 exe 확장자를 붙여서 실행해보자.
위와 같이 당연하게도 "maple19out"으로는 파일 복호화가 안된 것을 알 수 있다. file 자체가 잘못된 키 값으로 복호화가 되었으므로, 새로 파일을 다운로드하고 디버거를 통해 디버깅을 해보자.
2. Debugging(with OllyDbg)
x32dbg와 ollydbg를 반복 해면서 다뤄봤는데 뭔가 ollydbg가 더 잘 작동하는 것 같다... 당분간은 64bit 프로그램을 제외하고는 ollydbg를 이용할 것 같다. 실행하자마자 해당 프로그램은 콘솔 출력, key 입력, 파일 open/close 등의 연산을 수행하므로, 해당 함수를 호출할 것이라는 예측과 함께 바로 module 검색을 해보았다.
그러나 위와 같이 아무것도 보이지 않는다. PUSHAD만 덩그러니 놓여있는 것으로 보아 해당 프로그램은 packing 되었을 가능성이 크다. 프로그램의 시작점부터 PUSHAD 명령어가 보이므로 이와 반대되는 POPAD 명령어가 있는지 찾아보았다.
다행히 POPAD가 나오고 이후에 JMP를 통해 어디론가 분기하는 것을 확인할 수 있다. OEP로 가는 듯하다. 해당 분기문에 BP를 설정하고 실행한 후, F7을 눌러 0044AC9B로 점프해보자.
EP로 보이는 곳으로 점프하였다. 이제 다시 한번 intermodular calls를 검색해보자.
위와 같이 정상적으로 프로그램 내부에서 호출된 intermodular call들이 나타나는 것을 확인할 수 있다. key 값을 입력받는 지점부터 디버깅을 하기 위해 해당부분으로 이동한 후, BP를 설정하고 F9를 눌러 실행시키자.
이제 스크롤을 조금 내려 전체적으로 어떻게 파일 관련 함수들이 호출되는지 확인해보자.
위와 같이 file이름을 갖는 파일을 rb(read binary)모드로 fopen 함수를 확인할 수 있다. 조금 더 스크롤을 내려보자.
feof를 이용해 파일에 끝에 도달할 때까지 getc함수를 이용해 1 byte씩 "file" 파일로부터 읽어 들인다. 이때, [ECX+5415B8]에 하나씩 차곡차곡 읽어 들인다. dump 창을 통해 확인해보자.
위와 같이 반복적으로 몇차례 읽은 직후 dump창을 확인해보면 하나씩 차례대로 읽어 들이는 것을 확인할 수 있다. 스크롤을 조금 더 내려보자.
위 부분은 프로그램의 핵심 부분으로 복호화를 수행하는 LOOP다. 크게는 위와 같이 동그라미 친 세 부분을 중점적으로 보면 되는데 그 기능은 다음과 같다.
(1) 파일로 부터 읽어들인 바이트를 ecx 레지스터에 옮긴다.
(2) input으로 입력한 key 중 한 byte와 XOR 연산을 수행한다. (이때, key는 바로 위쪽의 DIV 연산에 의해 끝 byte에 도달했을 경우 다시 처음 byte로 돌아간다.)
(3) (2)의 결과와 0xFF를 XOR 연산을 수행한다.
그림으로 도식화하면 다음과 같이 나타낼 수 있다. (Key 길이가 4인 경우)
XOR연산 성질에 의해, Key를 찾기 위해서는 주어진 "file" 파일에 0xFF를 XOR 하고, Original File을 바이트 단위로 XOR 하면 Key 값을 얻을 수 있다. 하지만 여기서 우리는 Original File을 모른다. 그런데 아까 readme.txt에서 봤듯이 복호화된 파일은 exe, 즉 PE 구조를 갖는 파일임을 알 수 있다. PE 파일의 앞부분인 dos header는 특별한 경우를 제외하고는 같으므로 아무 exe 파일이나 열어서 긁어오면 될 것이다. run.exe 파일을 HxD로 열어보자.
3. Solving(with python3)
아래와 같이 run.exe의 dos header 부분을 다 긁어오고, 암호화된 파일도 해당 부분만큼 긁어와서 다음과 같이 파이썬 코드를 작성하였다.
data = "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 9E 86 9C 97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 9C".split(' ') origin = "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 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00".split(' ') for i in range(len(data)): data[i] = int(data[i], 16) origin[i] = int(origin[i], 16) data[i] = data[i] ^ 0xFF data[i] = data[i] ^ origin[i] print(chr(data[i]), end="")
실행을 해보면 다음과 같은 결과가 나온다.
위와 같이 반복되는 문구를 key 값으로 다시 run.exe에 input으로 집어넣어 실행시켜보자.
위와 같이 "file" 파일이 복호화된 이후에 MZ 시그니쳐를 갖는 dos header 및 stub code가 보인다. 이제 file에 .exe 확장자를 붙이고 실행시켜보자.
반응형'Wargame > reversing.kr' 카테고리의 다른 글
[reversing.kr] Replace 풀이 (0) 2021.03.09 [reversing.kr] Music Player 풀이 (0) 2021.02.09 [reversing.kr] Easy ELF 풀이 (0) 2021.01.05 [reversing.kr] Easy Unpack 풀이 (0) 2020.12.13 [reversing.kr] Easy Keygen 풀이 (0) 2020.12.09