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 |