[Reversing.kr] Easy Keygen
2번째 문제 Easy Keygen 입니다.
이번에는 문제로 제공되는 파일은 압축 파일이며 압축 파일에 포함된 파일은
Easy_Keygen.exe 콘솔 프로그램과 ReadMe.txt 텍스트 파일이 입니다.
프로그램과 같이 제공되는 ReadMe.txt 텍스트 파일을 메모장으로 열어보면
위와 같이 시리얼 번호가 "5B134977135E7D13" 일 때의 이름을 찾아야 한다는 힌트를 주고 있습니다.
그 말은 즉 이름과 시리얼 번호를 매칭하는 루틴을 수정하여 크랙하는 것이 아닌
이름과 시리얼 번호를 매칭하는 루틴을 해석하여
문제에서 제공한 시리얼 번호 "5B134977135E7D13"와 매칭되는 이름을 찾아야 합니다.
어셈블리어 코드보다 읽기 쉬운 형식으로 변환해주는
IDA 디컴파일러 기능을 활용하여 main 함수를 C언어 형식으로 보도록 하죠.
main 함수에서 확인해야 할 것은
이전에 언급한 것과 같이 이름과 시리얼 번호를 매칭하는 루틴입니다.
하지만 strcmp() 함수에서 이름과 시리얼 번호를 매칭하기 때문에
매칭시키는 부분의 중요성은 사라졌고
이름을 통해 시리얼 번호를 생성하는 루틴을 확인해야 합니다.
파란색 사각형 안에 있는 루틴이 바로 시리얼 번호를 생성하는 루틴이며
입력했던 이름의 길이만큼 어떠한 배열과 XOR 하여 시리얼 번호를 데이터 형식으로 만들고
sprintf() 함수를 이용하여 16진수 문자열화 시키는 방식으로 시리얼 번호 문자열을 만듭니다.
어떤 방식으로 시리얼 번호를 만드는지는 확인하였고
입력했던 이름과 XOR 하는 배열을 찾는다면 문제에서 제공한 시리얼 번호
"5B134977135E7D13" 일 때의 이름을 찾을 수 있게 됩니다.
디버거를 부착해서 확인해보도록 하죠.
0x0040107E 주소에 브레이크 포인트를 걸고 이름을 입력해보면
위와 같이 해당 주소에 브레이크 포인트가 걸린 것을 확인할 수 있습니다.
ESP + ESI + 0x0C 에 위치한 메모리 주소에는 0x10, 0x20, 0x30 와 같은 배열이 있으며
입력했던 이름과 XOR 하여 시리얼 번호를 만들게 됩니다.
배열을 찾았으니 파이썬으로 간단하게 시리얼 번호를 만드는 루틴을 구현해 봅시다.
XOR 연산은 같은 데이터로 다시 XOR 해준다면 원래의 값으로 돌아오는 특징이 있으므로
문제에서 제공된 시리얼 번호를 XOR 해준다면 이름을 찾을 수 있습니다.
keys = [0x10, 0x20, 0x30]
datas = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
i = 0
for data in datas:
if i > 2:
i = 0
result = data ^ keys[i]
print(chr(result), end='')
i = i + 1
K3yg3nm3
Easy Keygen의 정답은 K3yg3nm3 입니다.