CodeEngn advance 09
코드엔진 advance 09번 문제풀이
프로그램을 실행하면 아래와 같은 창이 뜨고 아무 값이나 입력하니 실패 메시지가 나타났다.
이제 PEiD로 파일을 열어보면 패킹되어있지 않음을 알 수 있으니 올리 디버거로 프로그램을 열어서 문자열을 살펴보면 아래와 같은 문자열들을 확인할 수 있다.
Password를 클릭하여 해당 위치로 간 뒤 분석을 해보면 아래와 같이 주소 00F513FF에서 함수를 호출한 뒤 실패 메시지가 뜨는 것을 확인할 수 있었다.
이제 CALL 00F51000을 F7으로 들어가 분석을 진행해 보니 아래와 같이 00F5104B에서 내가 입력한 값을 16진수로 변환한 값과 [ECX]에 들어있는 88228F를 비교하는 것을 확인할 수 있었다.
이제 프로그램을 다시 실행시켜 88228F를 10진수로 변환시킨 8921743을 패스워드로 입력하니 다시 실패 메시지가 뜨는 것을 볼 수 있었다.
다시 올리 디버거로 돌아가서 천천히 분석을 진행하다 보면 아래에서 보이는 것처럼 주소 E412AB에서 bl값이 0인지 확인하고 0이면 ZF를 설정하여 아래에 JZ문을 통해 실패 메시지로 가는 것을 확인할 수 있었다.
이 구간은 위에서 보았던 입력한 name값을 16진수로 변환한 첫 문자와 널 값을 비교하여 ZF를 0으로 설정하는데 계속 진행하면 SETZ BL에서 BL에 ZF와 같은 값을 설정하므로 BL은 0이 된다.
BL값이 0이 되면 TEST BL, BL문을 실행하여 ZF가 1로 설정되고 실패 메시지로 넘어가므로
주소 1171012구간에서 입력한 값 한자리와 널 문자를 비교할 때 EDX레지스터의 값을 0으로 바꿔주고 실행해보면 성공 메시지가 뜨는 것을 볼 수 있었다.
처음에는 패스워드 비교 값을 잘 찾지 못해서 허덕였지만 차근차근 실행하면서 레지스터 값을 살펴보니 찾을 수 있었고 SETZ문과 SBB문을 공부할 수 있었다.