<Wargame & CTF>/Reversing.kr

[ Reversing.kr ] Ransomware

gosoeungduk 2020. 1. 2. 02:05
반응형

Ransomware

#crack me #custom crypto


오랜만에 reversing.kr 을 풀어보았다.

랜섬웨어라고 하는데...

key를 알맞게 입력하면 압축파일로 같이 준 file을 올바르게 복호화 해주나보다.
(키 값의 옳고 그름에 관계없이 일단 어떤 연산을 거쳐 복호화 해주긴한다.)

일단 처음 바이너리는 UPX로 패킹되어있다는 것을 알 수 있다.

upx 언패커로 패킹을 해제하고...

IDA에 올려보면 hex ray를 방해하기 위한 용도인지 쓸데없는 쓰레기 코드들이 있다.

그래서인지 main함수가 너무 크다며, 디컴파일이 안된다.

고민을 하다가 idc 함수를 이용해서 다 nop 처리 후, main함수 프롤로그를 옮기기로 하였다.

아래는 패치코드이다.

addr=0x4135F4
end_addr=0x44A774
while(addr!=end_addr):
    idc.PatchByte(addr,0x90)
    addr+=1

그렇게 바이너리 패치를 하면, main함수가 이런식으로 온전한 모습을 갖춘다.

핵심이 되는 암호화 부분은 의외로 짧다.

이 부분인데, hex rays 에서 미처 디컴파일 하지 못한 부분이 있다.

다시 어셈블리로 자세히 보면, 로직을 제대로 볼 수 있다.

흠... 이 부분이긴한데, 정리해보면

1. 원래 파일의 모든 바이트를 돌면서 KEY값과 XOR 연산
2. 이 때, XOR하는 KEY값은 (인덱스 값)%(KEY길이) 에 따라 대응된다
3. 1번에서 XOR한 값을 0xFF와 XOR하여 원본파일에 덮어쓴다.

단순하다!

XOR의 성질을 이용해서 역연산 해주면 되는데 우리는 KEY값의 길이를 모른다.

이에 대한 힌트를 어디서 찾을까 하다가, README.txt 파일을 보았다.

원본파일은 EXE파일이다. EXE 파일의 특징은 무엇인가?

파일 시그니처가 MZ로 시작한다는 것!!!

하지만, 그 2바이트가 KEY일리는 없고 단서를 또 찾아보았다.

몇 개의 EXE파일을 보니 MZThis program cannot be run in DOS mode 사이에 수 많은 NULL값과 0x03이나 0x04같은 특정 구조를 갖추고 있엇다.

이를 이용해서 일단 한 번 키를 알아내보기로 하였다.

일단 맨 처음 16바이트를 이용하였다.

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

이 코드를 돌려보면...

일단 이렇게 나온다. 뒤에 let이 한 번 더나와서 의아했는데 몇 번 게싱해보니
'letsplaychess' 까지가 KEY였다.

KEY를 넣으면 파일이 온전히 복구되고, 실행은 안되지만 바이너리 문자열에서
플래그를 찾아볼 수 있다.

다른 문제에 비해 의외로 간단해서 순조로웠던 문제이다 :)

.
.
.
.

contact : a42873410@gmail.com

반응형

'<Wargame & CTF> > Reversing.kr' 카테고리의 다른 글

[Reversing.kr]ImagePrc  (0) 2019.03.27
[Reversing.kr]Replace  (0) 2019.02.08
[Reversing.kr]Music_Player  (1) 2019.01.30
[Reversing.kr]Easy Unpack  (0) 2019.01.18
[Reversing.kr]Easy Keygen  (0) 2019.01.15