Key를 이용해 Name을 알아내는 문제이다.
일단 어떻게 구성되어 있는지 한번 살펴보자.
우선 참조 문자열에서 단서를 찾았다.
문자열 위에 있는 코드 중, 우선 비교문에 breakpoint를 걸었다.
Name, Key에 모두 ‘a’를 넣었을 때의 결과이다.
45BB24에서 멈추며, Name의 길이를 비교하고 있다.
문제에서 2글자라고 했으므로, 그 주소의 코드를 패치해주자.
아래처럼 패치하고 exe 파일로 저장했다.
좀더 내려보면 45BB63에서 다음과 같은 문구를 볼 수 있는데, Key가 30자 이상이라는 의미이다.
하지만, 비교 대상은 정해져 있으므로 Key는 그 값으로 고정하면 된다.
두 글자이므로, 무난한 ‘00’을 넣어보았다. 만들어진 Key는 아래와 같다.
이제, 이 Key를 생성하는 곳을 찾아야 하는데, 45B850 함수가 그 역할을 한다.
동시에 지역변수로 저장까지 한다. 아래 그림 기준으로 12F544에 넣은 것이다.
아래는 Key 생성 코드이다.
이것 외에도 더 많긴 하지만, Brute Force 함수의 코드 복잡성을 고려해 일부만 확인하였다.
미리 45B850 함수의 연산 루프 4개를 분석해놓았다.
각 루프의 목적지를 보자면, 첫 번째는 ESI, 두 번째는 LOCAL.4, 세 번째는 EDI, LOCAL.5임을 알 수 있다.
게다가 하이픈(‘-‘)을 기준으로 두 번째(3EEC or 3F80)부터는 4086C8 함수로 생성하는 문자열이다.
즉, 확인할 것은 결과값의 첫 번째 문자열(66EE, 7629, …)과 1, 3번째 루프이다.
위에서 작성한 Pseudo-code를 Python으로 구현해보았다. 첫 루프에서 결과값의 첫 번째 문자열을 생성함을 알 수 있다.
이를 바탕으로, Brute Force 함수를 짜고 실행한 결과이다.
맞는지 확인해 보자.
따라서 정답은 112C61A276D0376F2F6B25DD3A337B1D
'[Wargame Write-up] > Simples.kr Season 1' 카테고리의 다른 글
[Simples.kr] [Season 1] Crackme 16 (0) | 2017.10.08 |
---|---|
[Simples.kr] [Season 1] Crackme 15 (0) | 2017.10.08 |
[Simples.kr] [Season 1] Crackme 13 (0) | 2017.10.08 |
[Simples.kr] [Season 1] Crackme 12 (0) | 2017.10.07 |
[Simples.kr] [Season 1] Crackme 11 (0) | 2017.10.07 |