먼저 문제를 살펴보면 StolenByte를 찾아야한다는 것을 알 수 있다.
여기서 StolenByte란 말그대로 훔친코드로, 패커가 이동시킨 코드의 윗부분(보통 OEP로부터 몇 개의 명령어)이라고 한다.
이는 언패킹을 해도 정상 실행이 되지 않으며 숨겨진 코드를 제자리에 가져도 놓고 제대로 복구를 하면 정상 실행이 된다.
또한, UPX에서는 마지막 JMP 전 POPAD 이후 일정 바이트의 코드를 의미한다.
먼저 주어진 실행파일을 Immunity Debugger로 실행시켜봤더니 위와 같이 PUSHAD 명령어가 보였다.
저번에 풀었던 문제처럼 언패킹을 해야하나? 라는 생각이 들었다.
먼저 Exeinfo PE 툴로 확인을 해봤더니 UPX라는 것을 알 수 있었다.
그래서 저번처럼 cmd 창에서 upx -d 파일이름 명령어를 입력해준 후 언패킹을 해주었다.
언패킹한 파일을 Immunity Debugger로 열어봤더니 제일 위에 위와 같이 NOP 코드가 써있는 것을 확인할 수 있었다.
이를 실행시켜보니 위와 같이 알 수 없는 글자들로 깨져 오류가 생기는 것을 볼 수 있었다.
힌트를 보고 언패킹 전에 패킹된 상태로 실행했던 코드를 잘 살펴봐야겠다는 생각을 했고
다시 처음 다운로드 받았던 파일을 열어봤더니 위와 같이 POPAD를 확인할 수 있었다.
패킹된 프로그램을 실행하면 PUSHAD부터 POPAD까지 원본 프로그램의 코드를 복구하는 작업을 할 것이고
POPAD부터 OEP까지의 코드에 어떤 것이 있나 확인해주는 작업이 필요하다.
위에서 본 POPAD 뒤의 코드를 하나씩 실행시켜보면 위와 같이 스택에 어떤 값들이 저장되는 것을 확인할 수 있다.
다시 언패킹해주었던 실행파일을 열고 NOP코드 부분에 아까 패킹된 파일에서 POPAD 뒤에 값을 PUSH해주었던 부분의 HEX 코드를 위와 같이 입력해주었다.
그랬더니 위와 같이 NOP으로 있었던 코드들이 딱 맞게 채워지는 것을 확인할 수 있었다.
이후에 계속 코드를 실행시켜보면 언패킹된 파일에서도 위와 같이 메세지가 깨지지 않고 잘 출력되는 것을 확인할 수 있다.
따라서 이 문제의 답은 StolenByte인 6A0068002040006812204000이고
구글링했던 StolenByte의 개념과 일치하다는 것을 확인할 수 있었다.
'2020 WINTER STUDY > CTF Study' 카테고리의 다른 글
[Reversing] Day 9_CodeEngn Basic RCE L07 (0) | 2021.02.25 |
---|---|
[Reversing] Day 8_CodeEngn Basic RCE L15 (0) | 2021.02.25 |
[Reversing] Day 7_CodeEngn Basic RCE L04 (0) | 2021.02.24 |
[Reversing] Day 6_CodeEngn Basic RCE L02 (0) | 2021.02.22 |
[Reversing] Day 6_Anti-Debugging (0) | 2021.02.22 |