CodeEngn advance 09

코드엔진 advance 09번 문제풀이

프로그램을 실행하면 아래와 같은 창이 뜨고 아무 값이나 입력하니 실패 메시지가 나타났다.

ad9

이제 PEiD로 파일을 열어보면 패킹되어있지 않음을 알 수 있으니 올리 디버거로 프로그램을 열어서 문자열을 살펴보면 아래와 같은 문자열들을 확인할 수 있다.

ad9-1

Password를 클릭하여 해당 위치로 간 뒤 분석을 해보면 아래와 같이 주소 00F513FF에서 함수를 호출한 뒤 실패 메시지가 뜨는 것을 확인할 수 있었다.

ad9-2

이제 CALL 00F51000을 F7으로 들어가 분석을 진행해 보니 아래와 같이 00F5104B에서 내가 입력한 값을 16진수로 변환한 값과 [ECX]에 들어있는 88228F를 비교하는 것을 확인할 수 있었다.

ad9-3 ad9-4

이제 프로그램을 다시 실행시켜 88228F를 10진수로 변환시킨 8921743을 패스워드로 입력하니 다시 실패 메시지가 뜨는 것을 볼 수 있었다.

ad9-5

다시 올리 디버거로 돌아가서 천천히 분석을 진행하다 보면 아래에서 보이는 것처럼 주소 E412AB에서 bl값이 0인지 확인하고 0이면 ZF를 설정하여 아래에 JZ문을 통해 실패 메시지로 가는 것을 확인할 수 있었다.

ad9-6

이 구간은 위에서 보았던 입력한 name값을 16진수로 변환한 첫 문자와 널 값을 비교하여 ZF를 0으로 설정하는데 계속 진행하면 SETZ BL에서 BL에 ZF와 같은 값을 설정하므로 BL은 0이 된다.

ad9-7

BL값이 0이 되면 TEST BL, BL문을 실행하여 ZF가 1로 설정되고 실패 메시지로 넘어가므로

주소 1171012구간에서 입력한 값 한자리와 널 문자를 비교할 때 EDX레지스터의 값을 0으로 바꿔주고 실행해보면 성공 메시지가 뜨는 것을 볼 수 있었다.

ad9-8

ad9-9

처음에는 패스워드 비교 값을 잘 찾지 못해서 허덕였지만 차근차근 실행하면서 레지스터 값을 살펴보니 찾을 수 있었고 SETZ문과 SBB문을 공부할 수 있었다.