문제를 받아 zip파일을 풀면 이렇게 두 프로그램이 나온다.
Original.exe 를 실행시키면
위 그림과 같이 메세지박스하나가 뜬다.
그리고 Packed.exe를 실행시키면
Password를 체크한다.
근데 이 박스안에 들어가는 패스워드를 찾는 문제는 아닌 것 같다.
어쨌든, 메시지박스에서 메시지를 받아오는것이므로
SendMessageA 함수에 브레이크포인트를 걸고 실행시키면
문자를 받아와서 어떤 한 함수를 실행시킨다.
그리고나서 EAX와 E98F842A를 비교하고
결과에 따라서 점프를 하는데, 저 점프문을 패치해주지않으면
아무리해도 입력만 하게되는 불상사를 낳을 수 있다.
위에서 점프문을 잘 패치하고 내려오다보면 이 함수 루틴을 만난다.
이 곳에서 바로 복호화를 진행해준다.
루틴은 위 그림을 보면 알 수 있다.
결국 저 복호화를 성공적으로 해 키 값을 출력하기 위해서는
Packed 의 00401000 eax, Original 의 00401000 eax,
Packed 의 00401004 eax, Original 의 00401004 eax,
가 필요하다. 그리고 각각 짝이 맞게 xor 연산을 해주면
값이 두개 나오게 되는데 그 값을 가지고 코드를 이용해서
브루트포싱을 하면 ebx의 값을 구할 수 있고,
그 ebx의 값과 xor한 eax의 값을 사용해서
강제로 바꿔주면 키 값이 뜨게된다.
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 32 | #include <stdio.h> int main() { int firsteax = 0xB7AAC296, nexteax = 0x5A5A7E05; int temp = 0, i = 0; while (1) { _asm { mov eax, firsteax mov cl, al mov ebx, i rol ebx, cl xor eax, ebx mov cl, bh ror eax, cl add ebx, eax mov temp, eax } if (temp == nexteax) printf("0x%08x\n", i); if (i == 0xffffffff) break; i++; } return 0; } |
사실상 어셈코드는 저 위 복호화 그림의 어셈코드를 거의 그대로 가져온 것이다.
두 개의 ebx 값을 얻을 수 있다. 이걸 가지고 풀면 된다
복호화를 시작할 때의 모습이다.
여기서 EAX와 EBX 값을 바꿔주면 풀린다.
바꿔주고 실행하자.
키 값이 떴다. 끝.
'Wargame > Reversing-W' 카테고리의 다른 글
CodeEngn basic 15 (0) | 2017.07.18 |
---|---|
reversing kr CSHOP (0) | 2017.07.13 |
reversing kr ransomware (0) | 2017.07.12 |
reversing kr ImagePrc (0) | 2017.07.11 |
reversing kr Replace (0) | 2017.07.11 |