본문 바로가기

[Wargame Write-up]/Yoire

[Yoire] [reversing] pe.stage3/01_crackme_benten.php

PEview로 볼 수도 있지만, 복사 및 붙여넣기가 안된다는 치명적인 단점이 있어, IAT 정보를 추출하는 코드를 직접 짰다.


그 결과는 다음과 같다. 역시 이번에도 GetDlgItemTextA 함수를 이용하고 있다.




GetDlgItemTextA 함수를 이용해 입력값을 가져와 0x401090 함수의 parameter로 사용하는데, 호출 후 함수의 반환값과 0xB79E763E와 비교한다.




암호화 루틴에 주석을 달았다. shift 연산이 있으므로 역으로 연산하는 것은 불가능해 보이므로, 조건부 Brute Forcing을 사용하자.


Sleep과 GetTickCount을 이용해 암호화 처리 시간을 계산하고, 반복 루틴 이후에 이 시간에 제한을 둔다.


아래 이미지의 주석에 의하면, return 0이 되도록 하려면 반복 루틴 처리 시간은 0x15e(350 ms) 이상 0x2ee (750 ms) 이하가 되어야 한다.




글자 수로 제어할 수 있을 것 같아서 aaaaaaa로 7글자 입력 시 처리 시간을 측정했는데, 1156 ms가 나왔다.




aaa를 입력값으로 줬을 때, 암호화 시간이다. 100ms가 나온다.


이런 식으로 최대 및 최소 글자 수를 알아보고 코드를 짜는 데 반영하면 된다.




통으로 Brute Forcing을 돌리기엔 시간과 메모리가 많이 소모되므로, 특정 조건이 아니면 버리도록 구현했다.




실행 시 for문 내부에 걸어둔, 부분적으로 조건에 맞는 후보들이 먼저 출력된다.




이 과정이 끝나면 5초 후 최종 필터링 결과가 나타나도록 작성했다.




최종적으로, 아래처럼 최종 암호화 결과가 비교값과 같은 것만 필터링해서 답 후보를 출력해준다. 영단어 같이 생긴 단어가 답이다.