Reversing/WriteUp
[Reversing.kr] Ransomware
BadSchool
2017. 2. 21. 02:18
문제사이트 : Reversing.kr
문제이름 : Ransomware
링크 : http://reversing.kr/challenge.php
풀이
↑프로그램을 실행 한 화면이다. 어떤 더덩넘이 파일을 암호화시키고 5천억 달러를 벌려고 한다. 정말 나쁜놈 인듯 싶다. Key를 입력하면 파일이 복구되지만 잘못되면 더 꼬인다고 한다.
일단 우리의 올리디버거로 확인을 해보자.
참고로 이 파일은 UPX로 패킹되어 있다. 어떤 문제던 풀기 전에 패킹여부 확인은 필수이다.
↑분석을 해보니 파란색으로 하이라이트 한 부분에서 내가 입력한 키값을 순서대로 한글자씩 불러오고, 암호화 된 파일의 바이너리값도 가져와서 XOR연산을 한 뒤 0xFF로 또한번 XOR연산 해준다.
즉 순서대로 보면
파일 ^ 입력값 ^ 0xFF
↑여기서 중요한 힌트가 하나 있는데, 바로 암호화 된 파일이 EXE파일 이라는 것이다. 그뜻인 즉 파일헤더 부분이 보통 EXE파일과 같다는 것. 이를 통해 코드를 짜 볼 수 있다.
↑file 의 한줄과 일반exe파일의 한줄을 가져와서 코드를 짰다. 코드자체에서도 불러올 수 있겠지만 미숙한 관계로..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> void main() { int arr[] = { 0xDE ,0xC0 ,0x1B ,0x8C ,0x8C ,0x93 ,0x9E ,0x86 ,0x98 ,0x97 ,0x9A ,0x8C ,0x73 ,0x6C ,0x9A ,0x8B }; int arr2[] = { 0x4D, 0x5A , 0x90 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0xFF , 0xFF , 0x00 , 0x00 }; int result[16] = { NULL }; int xor = 0; for (int i = 0; i < 16; i++) arr[i] = arr[i] ^ 0xFF; for (int i = 0; i < 16; i++) { for (int j = 1; ; j++) { xor = arr[i] ^ j; if (arr2[i] == xor) { printf("%c", j); break; } } } printf("\n"); } | cs |
↑코드 실행 결과. letsplaychess까지 출력되고 다시 반복되는 듯 하다.
↑아까 구해낸 키값을 입력하여 복호화 시켰다.
참고로 복호화 된 exe파일도 UPX로 패킹되어 있다. 가볍게 언패킹 시키고 툴로보니 답이 바로 나왔다.
↑답 : Colle System.