워게임 풀이
2. Easy Keygen
Reversing.Kr
Copyright © 2012-2023 Gogil All Right Reserved.
reversing.kr

문제 파일 메모장을 살펴보니 Serial Key가 5B134977135E7D13인 Name을 찾아야 하는 것 같다.

실행 파일을 실행시켰더니 Name과 Serial을 입력 받고 그냥 종료된다. 아마 Name이 틀렸기 때문에 종료되는 것 같고 올바른 Name을 입력할 경우 Correct! 가 나올 것으로 예상된다!
올리디버거로 해당 실행 파일을 열어보았다.

초록색으로 형광펜 친 부분을 집중해서 보면, Serial 생성 루틴을 찾을 수 있다. 입력 받은 문자열을 가져와서 하나씩 0x10, 0x20, 0x30과 차례로 XOR 연산을 진행하고 있다.

[ESP+ESI+C] 안의 값을 가져오고, [ESP+EBP+10]의 값을 가져온다.
그리고
[ESP+ESI+C]에 0x10,
[ESP+EBP+10]에는 내가 입력한 첫번째 값이 들어온다.

그 둘을 XOR 해준다. 그 다음 loop에는 0x20을 [ESP+ESI+C]에...

그리고 ESI에 생성한 Serial 값을 저장하고 입력받은 Serial 값과 비교해서 일치할 경우 "Correct!"를 아닐 경우 "Wrong"을 띄우는 곳으로 점프한다.
README 메모장에서 Serial이 5B134977135E7D13이라고 알려주었으므로 아래와 같이 생각할 수 있다.
- 내가 입력한 값의 1번째 값과 0x10을 xor하면 0x5B가 나온다.
- 내가 입력한 값의 2번째 값과 0x20을 xor하여 0x13이 나온다.
- 내가 입력한 값의 3번째 값과 0x30을 xor하여 0x49가 나온다.
- 내가 입력한 값의 4번째 값과 0x10을 xor하여 0x77이 나온다.
- 내가 입력한 값의 5번째 값과 0x20을 xor하여 0x13이 나온다
- 내가 입력한 값의 6번째 값과 0x30을 xor하여 0x5E가 나온다.
- 내가 입력한 값의 7번째 값과 0x10을 xor하여 0x7D가 나온다.
- 내가 입력한 값의 8번째 값과 0x20을 xor하여 0x13이 나온다.
#include <stdio.h>
int main() {
int serial[] = { 0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13 };
int value[3] = { 0x10, 0x20, 0x30 };
int count = 0;
for (int i = 0; i < sizeof(serial) / sizeof(int); i++) {
if (count == 2) {
printf("%c", serial[i] ^ value[count]);
count = 0;
}
else {
printf("%c", serial[i] ^ value[count]);
count++;
}
}
return 0;
}
Seiral '5B134977135E7D13'를 거꾸로 위 계산을 거꾸로 해서 Name으로 변경하는 코드

위와 같은 결과가 나온다.
Name: K3yg3nm3
Serial: 5B134977135E7D13



'Reversing' 카테고리의 다른 글
[Reversing] ImagePrc_WirteUp (0) | 2023.04.29 |
---|---|
[Reversing] Easy ELF_WirteUp (0) | 2023.04.29 |
PE 구조(2)__notepad.exe(메모장 프로그램) PE 헤더 분석 (0) | 2023.04.28 |
PE 구조 (0) | 2023.04.04 |
0201 메모리 구조, 스택, 스택 프레임 (0) | 2023.03.28 |