-
[reversing.kr] Easy Crack 풀이Wargame/reversing.kr 2020. 12. 7. 14:30
오늘 드디어 리버싱 관련 첫 wargame문제를 풀어보았다. Easy Crack이지만 전혀 easy하지 않았다... 우선 reversing.kr에서 easy crack문제를 다운로드하고 실행시켜보자.
1. 프로그램 실행
무언가 원하는 key를 입력해야 할 것 같다. 임의로 m을 10개 입력해보자.
역시나 예상대로 Incorrect 메시지 박스가 나타난다. 본격적으로 디버깅을 해보자.
2. Debugging (with x32dbg)
우선 위 프로그램이 작동하는 부분을 찾기 위해 디버거를 켠 후, 문자열 참조로 Incorrect Password라는 문자열이 호출되는 부분을 확인해보자.
"Congratulation !!" 문자열을 더블클릭하여 주변을 살펴보기로 하자.
일단은 congratulaion 문자열 기준으로 위로 코드를 하나씩 살펴보면 동그라미 표시한 esp+4에 있는 값과 'E'(ASCII 0x45)값이 같아야 하는 것을 확인할 수 있다. (같지 않으면 00401112의 jne 연산에 의해 Incorrect 메시지 박스를 호출하는 블록으로 점프한다.) 왠지 암호 중 하나가 E를 포함하고 있어야 할 것 같다. 좀 더 위로 스크롤을 올려보자.
위로 올리다 보면 sub esp, 64를 통해 스택의 크기를 늘려주고 이후에 esp를 통하여 여러 변수에 접근하는 것을 확인할 수 있다. 00401080에 bp를 설정하고 프로그램을 실행시켜보자.
bp를 설정하고 F9를 눌러 프로그램을 실행하자, 메시지 창이 나왔고 password를 입력하고 확인 버튼을 누르자 401080 지점에서 프로그램이 멈췄다. 해당 지점부터 F7, F8을 입력하며 하나씩 디버깅을 해보자.
이때, 004010AA의 수행 직후 스택에 password로 입력하였던 "mmmmmmmmmm"문자열이 나타난 것을 확인할 수 있었다. GetDlgItemTextA라는 것을 인터넷에 검색해보니 컨트롤에 입력된 텍스트를 얻는 함수로, 004010AA를 기준으로 프로그램에서 이제 입력으로 받은 password에 대한 여러 검사가 진행될 것임을 추측해볼 수 있다. 바로 다음 연산인 004010B0에서 cmp를 통해 값을 비교하고 있다. 어떤 값을 비교하는 것인지 esp+5를 확인해보자.
esp+5의 주소에 해당되는 부분을 hex dump창에서 이동하여 확인해보았다. 두 번째 'm'과 'a'를 비교하여 다른 경우 다음 연산에 의해 401135로 점프하게 되고, Incorrect message를 출력하게 된다. 예선 탈락하는 것이다. F9를 눌러 재입력을 받도록 하고 문자열을 mammmmmmmm로 수정하여 다시 해당 지점까지 수행해보자.
무사히 점프를 하지 않고 다음 연산으로 넘어갔음을 확인할 수 있다. 이제 다음 코드들을 살펴보자.
다음 나오는 조건 검사식들을 보아하니, 004010CB에서 test eax, eax를 통해서 eax에 0이 들어있다면 점프를 하지 않고 그렇지 않은 경우 점프를 하게끔 설정되어있다. 점프를 하게 되면 Incorrect password를 출력하는 블록으로 이어지게 된다. 따라서 eax에는 0이 있어야 하는데, 004010C3의 call 함수의 return 값이 eax에 저장될 것으로 추정된다. 위 함수 내부로 들어가서 어떻게 해야 0을 return하는지 확인해 보자.
다행히 함수 길이가 짧아 하나씩 실행시키면서 분석을 해보아도 될 것 같다.
실행시키다 보면 위와 같은 부분을 확인할 수 있는데 mov eax, ecx에서 0이 옮겨져야 하므로 우선 ecx에 0이 세팅되어야 한다. 그러기 위해서는 0040117B의 je 연산이 수행되어야 하는데 위의 00401176의 cmp문을 통해 두 operand가 같아야 한다. 이때 esi에 들어있는 값을 확인하기 위해 hex dump창을 찾아보면 5y가 있고, 위의 repe cmpsb 연산을 통해 5y와 mmmmmmmm의 앞의 두 문자를 같을 때까지 비교한다. 이후에 비교가 끝난 지점에서 그 전 값의 문자열을 비교하는데, 이는 결국에 문자열에 3, 4번째에 저장된 값이 5y여야만 통과가 가능하다.
이제 다시 "mammmmmmmm"를 "ma5ymmmmmm"으로 바꿔보고 프로그램을 실행시켜보고, 함수 호출 부분에서 F8을 눌러 eax에 0이 저장되는지 확인해보자.
다행히 두 번째 조건도 통과하였다. 이제 다음 코드를 살펴보자.
뭔가 코드가 길어 보이지만 하나씩 실행시켜보면 결국 R3versing이라는 문자열과 입력받은 password의 5번째부터의 문자열을 비교하고, 다른 부분이 있는 경우 조건을 통과하지 못한다. 이제 password를 "ma5ymmmmmm"에서 "ma5yR3versing"으로 변경하고 프로그램을 다시 실행시켜보자.
위의 조건을 통과하였고, 이제 처음 보았던 마지막 조건이 남았다. "ma5yR3versing" password는 위 사진의 조건을 통과하지 못한다. 어딘가 E로 수정해주어야 할 것 같은데, esp+4가 가리키는 곳이 입력 password의 어느 부분인지 확인해보자.
첫 번째 문자열과 비교하고 있다. 즉 'm'을 'E'로 바꿔주면 해결될 것 같다. 마지막으로 password를 "ma5yR3versing"에서 "Ea5yR3versing"으로 변경하고 프로그램을 실행시켜보자.
크랙에 성공하였다.
간단하게 프로그램의 흐름을 flow chart로 나타내면 다음과 같다.
반응형'Wargame > reversing.kr' 카테고리의 다른 글
[reversing.kr] Music Player 풀이 (0) 2021.02.09 [reversing.kr] ransomware 풀이 (0) 2021.01.08 [reversing.kr] Easy ELF 풀이 (0) 2021.01.05 [reversing.kr] Easy Unpack 풀이 (0) 2020.12.13 [reversing.kr] Easy Keygen 풀이 (0) 2020.12.09