CodeEngn advance 06
코드엔진 advance 06번 문제풀이
프로그램을 실행해보면 나의 남은 군생활은?이라는 제목에 숫자 1이 떠있는 메시지 박스 하나가 나타난다. 이 창은 확인을 눌러도 esc를 눌러도 꺼지지 않았지만 숫자가 하나씩 올라가는 것을 알 수 있었고 790이 되면 종료되는 것을 확인할 수 있었다.
이제 PEiD로 확인해보면 UPX로 패킹 된 것을 확인할 수 있었고 언패킹을 진행한 후에 올리 디버거로 파일을 실행해보니 안티 디버깅 기법까지 설정되어 있었다.
안티 디버깅을 해결하기 위해 ida를 사용하여 import된 함수들을 찾아보니 IsDebuggerPresent함수를 사용하는 것을 확인할 수 있었고 아래와 같은 위치에 있는 것을 확인하였다
이제 올리 디버거로 파일을 열어 해당 위치로 이동한 후에 IsDebuggerPresent함수 밑에 있는 분기문이 점프하지 못하도록 패치하여 안티 디버깅 기법을 무효화했다. (TEST문을 XOR문으로 변경하여 점프하지 않게 패치함)
이제 패치 된 파일을 분석해보면 관련된 문자열을 찾을 수 없었고 파일을 실행했을 때 메시지 박스를 띄우기 때문에 MessageBox함수를 찾아보니 아래와 같이 여러 개의 MessageBox함수가 있는 것을 확인할 수 있었다.
이제 위처럼 MessageBox함수 전체에 브레이크 포인트를 걸고 실행해 보면 아래와 같이 주소 0045E071에서 멈추는 것을 확인할 수 있었다.
MessageBox함수 파라미터를 살펴보면 EBP에 화면에 나타났던 숫자가 들어있는 것을 확인할 수 있었다. 이제 계속해서 실행해 가면서 분석하다 보면 아래와 같이 주소 00408F13에서 CMP를 이용해 EBP와 EAX를 비교하는 것을 볼 수 있고 레지스터 값을 확인해 보니 EAX에는 다음에 나올 숫자를 16진수로 변환한 값이 들어있었고 EBP에는 316이라는 숫자가 들어있었다.
EAX에 317을 넣고 실행해보니 프로그램이 종료됨을 알 수 있었고 이 값을 10진수로 변환하면 790 임을 알 수 있었다. 이 값은 앞에서 프로그램을 실행했을 때 종료되었던 값과 동일하다는 것을 알게 되었으니 답은 md5 암호화한 값이므로 790을 md5암호화한 2DACE78F80BC92E6D7493423D729448E값이 정답임을 알 수 있다.
이 문제를 푸는데 정말 많이 헤맨 것 같다.