CodeEngn advance 06

코드엔진 advance 06번 문제풀이

프로그램을 실행해보면 나의 남은 군생활은?이라는 제목에 숫자 1이 떠있는 메시지 박스 하나가 나타난다. 이 창은 확인을 눌러도 esc를 눌러도 꺼지지 않았지만 숫자가 하나씩 올라가는 것을 알 수 있었고 790이 되면 종료되는 것을 확인할 수 있었다.

ad6

이제 PEiD로 확인해보면 UPX로 패킹 된 것을 확인할 수 있었고 언패킹을 진행한 후에 올리 디버거로 파일을 실행해보니 안티 디버깅 기법까지 설정되어 있었다.

ad6-1 ad6-2

안티 디버깅을 해결하기 위해 ida를 사용하여 import된 함수들을 찾아보니 IsDebuggerPresent함수를 사용하는 것을 확인할 수 있었고 아래와 같은 위치에 있는 것을 확인하였다

ad6-2

이제 올리 디버거로 파일을 열어 해당 위치로 이동한 후에 IsDebuggerPresent함수 밑에 있는 분기문이 점프하지 못하도록 패치하여 안티 디버깅 기법을 무효화했다. (TEST문을 XOR문으로 변경하여 점프하지 않게 패치함)

ad6-4

이제 패치 된 파일을 분석해보면 관련된 문자열을 찾을 수 없었고 파일을 실행했을 때 메시지 박스를 띄우기 때문에 MessageBox함수를 찾아보니 아래와 같이 여러 개의 MessageBox함수가 있는 것을 확인할 수 있었다.

ad6-5

이제 위처럼 MessageBox함수 전체에 브레이크 포인트를 걸고 실행해 보면 아래와 같이 주소 0045E071에서 멈추는 것을 확인할 수 있었다.

ad6-6

MessageBox함수 파라미터를 살펴보면 EBP에 화면에 나타났던 숫자가 들어있는 것을 확인할 수 있었다. 이제 계속해서 실행해 가면서 분석하다 보면 아래와 같이 주소 00408F13에서 CMP를 이용해 EBP와 EAX를 비교하는 것을 볼 수 있고 레지스터 값을 확인해 보니 EAX에는 다음에 나올 숫자를 16진수로 변환한 값이 들어있었고 EBP에는 316이라는 숫자가 들어있었다.

ad6-7 ad6-8

EAX에 317을 넣고 실행해보니 프로그램이 종료됨을 알 수 있었고 이 값을 10진수로 변환하면 790 임을 알 수 있었다. 이 값은 앞에서 프로그램을 실행했을 때 종료되었던 값과 동일하다는 것을 알게 되었으니 답은 md5 암호화한 값이므로 790을 md5암호화한 2DACE78F80BC92E6D7493423D729448E값이 정답임을 알 수 있다.

이 문제를 푸는데 정말 많이 헤맨 것 같다.