티스토리 뷰

Reversing/* reversing.kr

reversing.kr - Ransomware

live2skull 2016. 7. 22. 14:56
1. 
특정한 키를 주면 그에 맞추어 file 이름의 파일을 해독하는 프로그램이다.
키를 알아낼 필요 없이, 암호화된 파일만 복호화하면 된다.
UPX로 패킹되어 있으니, 패킹을 풀고 분석한다.


2.
004135E0 main 문에서 스택에 공간을 할당하고, 비휘발 레지스터 ebx, esi, edi를 스택에 저장한 후에 , "push, pop, pusha, popa" 명령어들이 계속 이어져 있는 것을 볼 수 있다. 순서대로 실행하면, 프로그램에 전혀 영향을 미치지 않는 쓰레기 코드들이다.
0044A7AB 까지 이 코드들이 계속 이어져 있는데, 중간중간에 제대로 실행되어야할 코드들이 섞여 있다,

00425BB2 : 0044A990 함수를 프로시저로 스레드를 생성하고, (패치할 때 00425BC1 를 nop로 -> 이후 popa를 실행하고 jmp로 건너뛰게 되면 ebp가 복귀되지 않음)
0043819F : 화면에 경고 메세지를 표시,
0044A775 : 키를 입력받는 코드가 존재한다.

쓰레기 코드를 그대로 놔두어도 상관 없지만, IDA 에서 그래프 뷰가 작동하지 않고, 분석 시간이 너무 오래 걸리기 때문에
Immunity Debugger로 쓸데없는 코드를 jmp 문으로 넘어가도록 패치하고, 불필요한 코드들을  Undefine 처리한 후 함수를 다시 분석하면,
스택 뷰가 정상적으로 활성화된다.

0040100 함수도 쓰레기 코드로 구성되어 있다. 디버깅 시 속도를 향상하려면 push ebp 을 retn 으로 패치하면 된다.


3.
스레드로 호출되는 0044A990 주소의 함수는 "mov eax,1" 과 " test eax, eax / jz short loc_..." 을 이용해, 무한 루프를 가지고 있다.
전역 변수로 005415B0 주소의 1바이트를 엑세스하지만, 스레드 외에 다른 함수에서 접근하지 않고, 무조건 44h 값을 가진다.
스레드 함수는 프로그램의 실행에 큰 영향을 미치지 않는다.


4.
0044A79B : 0044A7C9 까지 ESP-0xc 에 입력받은 키값의 길이를 구한다.
이후 0044A819 까지 지역변수를 초기화하고, 파일을 열어준다.
0044A833 : fseek, ftell 을 통해 ESP-0x10c 에 파일의 길이를 구하고,  rewind 를 통해 파일 포인터를 다시 시작점으로 옮긴다.


5.
0044A856 ~ 0044A897 파일을 1바이트 단위로 읽어서 EOF 까지 byte_5415B8 에 저장한다. (카운터 - EBP-0x08)

핵심 복호화 코드
카운터를 만들고, 읽은 암호화된 데이터를 하나씩 불러온다.
키를 반복적으로 사용해, 암호화된 데이터 ^ 키 ^ 0xFF 순서대로 연산을 하고 본래 위치에 저장함을 알 수 있다.
-> 0044A8CF(키 xor), 0044A8E9(0xFF xor)


6.
복호화 코드를 알았으니, 이제 키를 구하면 된다.
Readme 에서 알려주었듯이, 원래 파일은 exe 파일이다.
필자는 exe 파일 헤더 중 DOS 호환 코드안의 "This program cannot be run in DOS mode" 문자열 원본으로 보고, 키를 찾는 코드를 만들었다.
(DOS 호환 코드까지는 모든 exe 의 헤더 길이가 같으므로)

plain ^ key = enc 일 때,
enc와 plain을 알고 있으므로, plain ^ enc = key 와 같은 형식으로 원래 키를 뽑아낼 수 있다.
# jochiwon.tistory.com
# reversing.kr Ransomware
f = open('file', 'rb')

f.seek(0x4e) # this program.... 데이터가 있는 위치로 이동
enc = f.read(0x26) # 그 크기만큼 읽는다
print(enc); print()

original = b'This program cannot be run in DOS mode'
test = ''

cnt = 0
for b in enc:
        test += chr((b ^ 0xff) ^ original[cnt]) # xor 연산 해 주고 문자로 변환
        cnt += 1

print(test)

키가 출력되는 걸 확인할 수 있다.


7.
알아낸 키를 나쁜놈이 준 프로그램에 넣고 돌려준 뒤, 확장자를 exe로 바꿔 실행한다.


'Reversing > * reversing.kr' 카테고리의 다른 글

reversing.kr - Easy ELF  (0) 2016.07.22
reversing.kr - ImagePrc  (0) 2016.07.22
reversing.kr - Music Player  (0) 2016.07.21
reversing.kr - Easy Keygen  (0) 2016.07.20
reversing.kr - Replace  (0) 2016.07.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함