본문 바로가기

Hacking/Reversing

CodeEngn_basic_9

Basic RCE L09

 

StolenByte를 구하시오 Ex) 75156A0068352040

 


이번 문제 파일은 UPX패킹이 되어있다. 이번에 StolenByte라는 단어가 나왔기 때문에 UPX패킹을 언패킹하지 않은채 실행, 언패킹을 진행한 뒤에 실행 총 2번 실행을 시켜볼것이다.

 

언패킹전 실행 / 1

언패킹후 실행 / 1

패킹 전, 언패킹 후 실행 / 2

 

언패킹전과 후의 차이점은 첫번째 출력되는 텍스트 박스이다. 패킹되어있는 파일은 정상적으로 출력시키지만 언패킹시킨 파일은 텍스트가 깨져서 에러를 출력한다.

( 첫 번째 창에서의 문제 )

 


 

문제를 풀기에 앞서 우리는 문제에서 제시한 StolenByte에 대해서 알아야 한다.

StolenByte란 패커가 훔친 바이트이다.

StolenByte는 패커가 이동시킨 코드의 윗부분 ( 보통 OEP 로부터 몇 개의 데이터 ) 이다.

이 경우 언패킹을 할시에도 정상 실행이 되지않는다.( 실제로 upx언패킹전에 실행시키면 정상적인 messageBox가 출력된다. ) 

하지만 숨겨진 코드를 다시 제자리에 제자리에 가져다 놓고 덤프, IAT 복구를 하면 정상실행이된다.

Upx 에서는 마지막 JMP 전 POPAD이후 일정 바이트의 코드를 의미한다.

 

 

이번 문제에서는 위와같이 빨간 칸 안에 있는 것들이 원래 패커가 훔친 StolenByte가 들어가있어야 할 장소이다. 

여기서는 MessageBoxA를 호출시키는데 필요한 인자가 부족하기 때문에 에러가 발생한 것이다.

 

패킹후에 이렇게 된 것이기 때문에 패킹 전인 파일을 뜯어보면 알수 있을 것이다.

 UPX 패킹의 특징은 [ PUSHAD ~ POPAD ] 명령어 내부에서 압축해제 코드가 실행 되고 [ POPAD ] 명령어 실행 후 [ JMP ] 명령어를 통해 OEP로 이동한다.

그렇기 때문에 우리는 POPAD실행 후인 JMP명령어의 전에 있는 코드를 보면 StolenByte를 알 수 있을 것이다.

ctrl + F를 통해 POPAD를 찾아가자

 

 

빨간 박스로 감싸져 있는 부분이 우리가 찾는 부분이다. 다른 코드들은 대부분 연산을 해주거나 비교를 하는 것들이기 때문이다.

이 부분의 OP코드를 적어 둔 뒤에 UPX언패킹 후에 MessageBox를 호출해주는 부분 위에 넣어주면 정상적으로 작동할 것이다.

 

 

우선 저 NOP부분의 OP코드를 아까 찾은 PUSH들의 OP코드로 바꿔줄 것이다.

ctrl + E를 통해 OP코드를 바꿀 수 있다.

 

 

위에서부터 하나씩 채우다보니 나머지 NOP코드들이 모두 사라졌다. 그리고 원래 패킹되어있던 파일과 똑같은 텍스트가 저장되어있었다.

이 부분의 OP코드를 차례대로 적으면 된다.

 

예 ) 

 

6A 00 68 35204000 68 40204000

이걸 붙인다.

'Hacking > Reversing' 카테고리의 다른 글

UPX 언패킹 하는법  (0) 2020.06.21
CodeEngn_basic_10  (0) 2020.06.21
CodeEngn_basic_8  (0) 2020.06.14
CodeEngn_basic_7  (0) 2020.06.14
CodeEngn_basic_6  (0) 2020.06.11