문제를 풀기 전 reversing.kr 1번 문제를 먼저 풀고 2번으로 넘어오는 것을 추천한다.
2022.07.30 - [Reversing] - reversing.kr 1번 Easy Crack 문제풀이
reversing.kr 2번 Easy keygen 개요
문제를 풀기에 앞서 간단한 PE분석을 진행하도록 하겠다.
분석 내용을 보면 엔트리 포인트와 파일 오프셋을 확인할 수 있고, C++로 개발된 것을 알 수 있다.
Easy Keygen.exe를 실행하면, input name과 input Serial을 받는다. 그리고 ReadMe.txt 파일을 보면 이번 문제의 목표가 있다. 해석해보면 시리얼 번호가 '5B134977135E7D13'인 이름을 찾아야 한다. 각설하고 이제 시작해보도록 하자.
reversing.kr 2번 Easy keygen 문제풀이
F8을 눌러가면서 프로그램을 진행하면서 문제풀이를 해보도록 하겠다.
4011EA에서 프로그램이 시작된다. 천천히 F8을 누르면서 input name이 나올 때까지 진행해보자.
프로그램을 읽으면서 진행하다 보면, 401299 번지에서 CALL과 함께 input name이 출력되는 것을 알 수 있다. 더 자세히 알기 위해 재시작하고 F7으로 함수를 확인해보자.
보면 아스키코드로 Input Name: 이 출력되는 부분과 Easy Keygen5 사진처럼 %s로 문자열을 입력받는 함수가 호출되는 것을 알 수 있다. F8을 한번 더 눌러서 Input Name에 간단하게 abcd를 입력해보자.
우리가 콘솔 창에서 입력한 abcd가 EDI에 저장되는 모습이다. 이후 EAX, EBP, ESI를 초기화하고,
40106에서 REPNE SCAS를 통해 문자열의 길이를 구하고 있다.
실제로 abcd를 입력하였으니, 문자열 길이 4가 ECX에 저장되는 것을 확인하였다.
이제 우리가 입력한 문자열을 하나씩 순서에 따라 XOR 연산을 진행한다. 문자 'a'의 아스키코드는 0x61이다.
따라서 EDX는 61이고, ECX는 10, 20, 30, 10, 20, 30 해당 문자 위치에 따라 값이 변하는 것을 확인할 수 있다.
문자열('abcd') XOR 결과값 |
a: 0x61 XOR 0x10 == 0x71 |
b: 0x62 XOR 0x20 == 0x42 |
c: 0x63 XOR 0x30 == 0x53 |
d: 0x64 XOR 0x10 == 0x74 |
우리가 입력한 문자열을 전부 XOR 하고 나면 반복문을 탈출하게 된다. XOR한 것이 해당 사용자의 Serial number가 된다.
다시 프로그램을 진행해서 우리가 도출한 Serial number 값인 '71425324'를 input Serial에 입력해주면, EAX에 우리가 입력한 값이 저장된다.
이후 방금 입력한 EAX와 기준 값 ESI를 비교하여 참이면 'Correct!'가 출력된다.
이러한 원리로 5B134977135E7D13을 구하면 문제가 해결된다.
답 :K3yg3nm3
코딩을 해서 구하는 경우, 아래 URL을 참고하여 코딩해보자.
https://github.com/leeggoggal/Python/blob/master/reversing.kr_easy_keygenme_reverse_xor.py
'Reversing > reversing.kr' 카테고리의 다른 글
reversing.kr 6번 ImagePrc.exe 리버싱 CTF 문제풀이 (0) | 2022.08.08 |
---|---|
reversing.kr 5번 Replace 문제 풀이. 해석 (0) | 2022.08.05 |
reversing.kr 4번 Music Player 문제해설 (0) | 2022.08.03 |
reversing.kr 3번 Easy Unpack Me 리버싱 문제 풀이 (0) | 2022.08.02 |
reversing.kr 1번 Easy Crack 문제풀이 (0) | 2022.07.30 |