문제파일을 다운받으면, 이렇게 구성되어있다. 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 할때 쓰이는 폰트가 매우 맘에든다.