본문 바로가기
Wargame Write-Up/Reversing.kr

[Reversing.kr] (Reversing) randsomware 풀이

by snwo 2020. 6. 22.

문제파일을 다운받으면, 이렇게 구성되어있다. file 은 암호화된 파일이다.

문제이름이 randsomware 이기때문에, file 을 바꿀것이라는걸 짐작할 수 있으므로,

복사본을 만들어놓자.

 


실행하면 입력한 키값을 바탕으로 복호화를 해주는데, 

 

 

복호화된 모습을 보니, exe 파일과 비슷한것같다.


올리디버거로 열심히 분석을 해봐도, 이상하게 아무것도 안나와서, DIE 로 열어보니,

UPX 로 패킹된걸 볼 수 있다.

 

바로 언패킹해버리자.


x32 디버거로, 언패킹된 프로그램에서 key : 문자열을 찾아왔다.

여기가 main 함수인것같다.


참고로 앞으로 중간중간 있게될 0x401000 함수는

아무의미없는 명령어 덩어리이다. 실행속도약간 늦추는 역할을한다.


첫번째, ebp-0x18 = key

key 배열의 주소값을 끝까지 하나씩 증가시켜서

첫번째인자의 주소를 빼서, key 배열의 원소개수를 구한다.


두번째, fopen 으로 file 파일을 연다.


세번째, getc 로 0x5415B8 에 file 의 내용을

EOF 까지하나씩 복사한다.


세번째,

ebp-8 = i 라고 보면되고,

ebp-10 = 2400 (file 의 크기)

ebp - C = key 의 길이

0x44D370[ i % 길이 ] = key 값

0x5415B8[ i ] = file 내용

 

key[i%(길이)] ^ file[i] ^ FF 을 fopen 후에 file 에 저장한다.

 

우리는 킹리적갓심으로 복호화된 파일이

exe 파일임을 알 수 있다.

 

일단 키의 길이를 구해보자.


암호화된 원본파일에서 다음과같이 반복되는 구간이있다.

값을 복사해와서 주기를 알아보자.

 

9 4 다음에 9 4  9 4 이렇게 반복되는걸 보니, 

주기는 는 9+4 인 13 임을 알 수 있다.

 

Length of key is 13


>>> file="DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B".split()
>>> exe="4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00".split()
>>> for i in range(len(exe)):
print(chr(int(exe[i],16)^0xff^int(file[i],16)),end='')

 

letsplaychesslet

 

이후 내 다운로드파일중, 근본있어보이는 EXE 파일 헤더를 긁어오고,

원본파일 앞부분을 긁어와서, xor 연산시키니,

13글자의 키가 나왔다.

 

이 키를 run.exe 에 입력하면 

 

이렇게 복호화가 된다. 이제 .exe 로 확장자를 바꿔 실행해보자.


성공이다. 이제 reversing.kr 사이트에있는 AUTH 에 입력하면된다.

나는 AUTH 할때 쓰이는 폰트가 매우 맘에든다.