반응형

문제는 StolenByte를 원하고 있다. 

 

여기서 StolenByte란,

직역하면 훔친 바이트란 뜻으로 프로그램의 한 부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드를 말한다. 주로 옮겨지는 코드는 엔트리 포인트 위의 몇 개의 옮겨진 코드들이며 OEP주소로 점프하기 전에 위치에서 PUSH 된다. 이러한 StolenByte는 주로 패커가 프로그램을 패킹할 때 볼 수 있는데 이렇게 옮겨진 코드들은 할당된 메모리 공간에서 실행 된다. 이 때문에 패킹된 프로세스가 덤프될 때 StolenByte를 복구하지 못하면 프로그램은 정상적으로 작동하지 못하게 된다.

요약 하자면 StolenByte란 패커가 위치를 이동시킨 코드로써 보호된 프로그램의 코드의 윗부분이다.

더 간단하게 말하자면 POPAD랑 OEP사이에 있는 연속된 PUSH이다.

 

그래서 문제를 처음 보게 되면

UPX로 패킹이 되어 있는데 이것을 프로그램을 통해 언패킹 하고 실행을 하게 되면,

이런식으로 파일이 깨져셔 실행되게 된다. 위에서 확인 했던 것처럼 패커가 StolenByte를 복구하지 못했기 때문에 이렇게 된 것이다. 이것이 원본 코드 중 일부를 별도의 영역에서 실행하게 하여 OEP의 위치를 다른 위치로 가장하는 기법인 StolenByte이다. 이제 디버깅을 시작해보겠다.

 

 

언패킹한 파일

이런식으로 언패커를 활용하여 프로그램을 패킹 해제를 하고 디버거로 열어보면 Messagebox가 호출이 되는데 인자값으로 아무것도 들어가지 않으니 상단에서 봤던 오류를 보게 되었다. 다시 패킹된 파일을 열어보겠다.

 

 

 

 

패킹된 파일

이런식으로 프로그램이 언패킹 작업을 진행하다가 OEP로 가는 구문 위에 push구문 3개가 보일 것이다. 원래 메시지 박스에 출력되어야 하는 문자열들이 OEP로 가기 직전 스택에 들어가는 모습니다. 이런식으로 특정 구문을 다른 메모리 주소에 훔쳐와 저장해놓는 디버깅 방어 기법을 StolenByte라고 한다. 

이 push구문 3개를 원래 있던 자리인 언패킹한 파일 EP에 넣어주겠다.

 

 

 

수정한 패킹해제한 파일

이렇게 NOP로 되어 있던 부분에 Stolenbyte에 있던 구문 3개를 추가시켜주었다.

구문을 추가 했으면 구문을 추가한 버전의 파일을 새로 만들어야한다.

 

 

CTRL + P 또는 [파일] - [패치]를 통해 저장 할 수 있다.

 

 

패치한 파일을 실행시켜보면,

구문이 잘 출력 되는 모습이다.

 

여기서 좀 헷갈릴 수 있는데, 코드엔진 페이지에 키를 입력 할 때, 바이너리 코드로 된

"6A0068002040006812204000" 이 부분을 입력 해주어야 한다.

 

정답은 "6A0068002040006812204000"

 

물론 key는 알아 냈지만 프로그램이 원하는 부분을 충족시켜주지 않았으니 

패치한 파일로 충족시켜주도록 하자.

 

 

파일을 찾을 수 없다고 뜨는 것을 보니 파일을 만들어주어야 할 것 같다.

"abex.l2c" 라는 파일을 읽어 와서 파일의 크기가 0x12(18)byte이면 well done이 출력 될 것 같다.

18바이트 크기를 가진 파일을 만들어주고 실행시켜보면, 나는 a를 18개 입력한 txt 파일을 확장자를 다르게 바꾸었다.

 

 

성공!

반응형

'Reversing 문제 풀이 > CodeEngn.com_Basic (Clear)' 카테고리의 다른 글

codeengn-basic-L11 풀이  (0) 2022.04.02
codeengn-basic-L10 풀이  (0) 2022.03.31
codeengn-basic-L08 풀이  (0) 2022.03.21
codeengn-basic-L07 풀이  (0) 2022.03.20
codeengn-basic-L06 풀이 OEP알아내기  (0) 2022.03.13