[8주차] 제작 문제 풀이

파일을 실행하면 이렇게 뜬다.

파일 실행 결과

아이다로 디컴파일 했을 때 main이 위와 같다. 결론부터 말하면 위 for문을 반대로 만들면 끝나는 문제이다.

//원래 코드 
for ( i = 27; i >= 0; --i )
    *v3++ += byte_406000[i] - i;

//수정 코드 
for ( i = 0; i <= 27; ++i )
    *v3++ += byte_406000[i] + i;

byte_406000의 배열은 위와 같다(16진수).

푸는 방법은 두 가지가 있다.

  1. 파이썬이나 C++로 코드를 작성하고 실행하기
  2. 어셈블리 수정

어셈블리를 이해한다면 이걸 수정하는 편이 더 편하다(코드를 작성하려면 조금 귀찮다).

간단하게 sub cl, al에서 sub를 add로만 바꿔보자.

어셈블리 수정

아래 덤프를 보면 문자열이 담긴 것을 알 수 있다.

문자열 덤프

다만 경고창에 SWING{} format이 맞냐고 물어본다. 출력된 문자열을 거꾸로 하면 SWING{} format이 맞아서 직접 눈으로 풀어도 되지만 0부터 증가하며 실행되는 반복문으로 수정해보자.

일단 반복문 시작 전 eax에 초기화를 해주고 있는데 이부분을 1B가 아닌 0으로 설정해주고 sub cl, al은 아까와 같이 add cl, al로 바꿔준다. sub eax, 1을 add eax, 1로 바꿔준다.

그리고 f8을 누르며 동적 분석해준다.

동적 분석

덤프를 보면 맞게 쓰였다. 이걸 출력까지 해주려면 }까지 루프를 돌려주고 멈춰야 한다. 임의로 코드를 수정했기 때문에 jns가 무한 루프문이 된다. 여길 나가려면 FLAG에 SF를 0에서 1로 바꿔준다.

플래그 수정

오른쪽 참조.

디버깅 결과

이러고 f8을 또 열심히 누르면 디버깅창에 flag가 알맞게 뜬다.