728x90
파일 확인
처음 실행하고 "확인"을 누르면 Error 창이 뜬다.
- Detect It Easy
UPX로 패킹된 파일이다!
그냥 바로 upx로 언패킹해줬다.
파일 분석
언패킹하고 바로 실행하면
깨진 문자들이 보인다.
문제에서도 알 수 있듯, 이는 "Stolen Bytes(Remove OEP)"때문에 생긴 현상이다.
✔ Stolen Bytes(Remove OEP)
원본 코드의 일부, 주로 OEP 코드 부분을 패커/프로텍터가 생성한 메모리 영역에 가져다 두는 기법이다.
덤프를 시켰을 때 제대로 stolen bytes를 복구하지 못하면 제대로 실행되지 않고, 언팩했을 때 우리가 아는 그런 익숙한 코드가 아닌 다른 형태의 코드들이 나타난다.
>> POPAD와 jmp OEP 사이에서 PUSH 하는 모든 코드들을 stolen bytes라고 한다.
다시, 패킹된 파일로 돌아가서 x32dbg로 열어서 popad를 추적해서..
이렇게 jmp 하기 전까지의 push 명령 3개를 확인할 수 있다. popad와 jmp 사이에서 반복문을 돌고 있다.
- 6A 00
- 68 00204000
- 68 12204000
jmp 명령에서 스텝오버[F8]해서 OEP에 도착했다. 이 때 코드들이 지금까지 봤던 OEP에서의 코드들과 많이 다르다. (stolen bytes 때문!)
✔ stolen bytes가 있는 경우 OEP를 직접 찾았을 때, 해당 주소에서 stolen bytes의 opcode들을 1byte씩 잘라 앞에 넣는다고 생각해야한다
그래서 다시 코드의 앞부분들까지 확인해보면 NOP로 0xc byte만큼 채워져있는 것을 볼 수 있다. 그리고 stolen bytes에 해당하는 코드들의 opcode들도
6A 00 68 00 20 40 00 68 12 20 40 00 으로 총 12byte인 것을 알 수 있다.
따라서 진짜 OEP는 0x0040100c가 아니라, 0x00401000이다!
SMALL
'Reversing > Reversing (Wargame)' 카테고리의 다른 글
[CodeEngn] BASIC RCE L13 (0) | 2021.06.01 |
---|---|
[CodeEngn] BASIC RCE L12 (0) | 2021.05.28 |
[HackCTF] strncmp (0) | 2021.05.28 |
[CodeEngn] BASIC RCE L08 (0) | 2021.05.11 |
[CodeEngn] BASIC RCE L06 (0) | 2021.05.11 |