문제 정보

StolenByte를 구하시오 Ex) 75156A0068352040

 

풀이 힌트

2-1. PUSHAD(PUSHAL)

범용 레지스터의 값을 Stack에 저장

 

2-2. POPAD(PUSHAL)

Stack의 데이터를 범용 레지스터에 저장

 

2-3. Stolenbyte

안티디버깅 기법으로 일부 코드를 훔쳐서 다른 부분으로 옮긴 것을 말한다.

주로 OEP 주소로 점프하기 전 위치에서 값을 PUSH하는 방식으로 수행된다.

 

문제 풀이

더보기

3-1. 문제 프로그램을 실행하면 "Hmmmmm, I can't find the file!" 이라는 에러 문구가 출력된다. 해당 구문이 출력되는 부분을 찾아서 에러를 확인해보자.

 

3-1. PEiD를 통해 UPX로 패킹된 것을 확인하고, 수동으로 패킹을 풀어보자.

 

3-2. 패킹된 파일을 x32dbg를 통해 열고, F9를 눌러서 엔트리포인트로 이동하여 pushal 명령을 확인한다.

※ 패킹된 실행파일은 언패킹 전 PUSHAD(PUSHAL) 명령어를 통해 레지스터의 상태를 저장하고, 언패킹이 완료되었을 때 POPAD(POPAL) 명령어를 통해 레지스터의 상태를 복구한다. 따라서 POPAD 명령어 근처에는 원래의 엔트리포인트로 이동하는 점프 명령어가 있다.

 

3-3. 아래로 쭉 내리다보면 popal 명령어와 원래의 엔트리 포인트로 이동하는 점프문을 확인할 수 있다.

 

3-4. 점프문이 실행되면 0040100C 주소로 이동되는데 MessageBoxA 함수의 인자 값이 4개 중 1개밖에 보이지 않고 인자 값이 들어가야할 위치에 nop이 채워져 있는 것을 확인할 수 있다. 

 

3-5. POPAL 명령을 통해 Stack 데이터를 레지스터로 복구하고 OEP로 점프하기 전 3개의 PUSH 명령을 통해 스택에 데이터를 넣는데 해당 부분이 언패킹된 프로그램에서 MessageBoxA 함수 인자 값으로 들어가야할 데이터로 추측할 수 있다.

 

 

3-6. 문제의 push 주소를 덤프로 따라가보면 해당 바이트 값을 확인할 수 있다. 

 

3-7. 확인한 Stolenbyte 값(6A0068002040006812204000)을 Auth 페이지에 입력하면 정답임을 확인할 수 있다.

 

 

복사했습니다!