OEP와 Stolenbyte를 찾는 것이 문제이다.
파일을 다운받아 실행시켜보니, 오른쪽 위의 그림처럼 ok를 누르라고 하고 누르면 파일을 찾을 수 없다고 한다.
일단 exeinfo로 파일을 확인해주었다.
Upx 패킹이 되어있다고 한다.
Upx_unpacked.exe라는 파일을 따로 만들어서 언팩을 해주었다.
패킹이 잘 풀렸고 다시 실행해보았는데 아래와 같이 문자들이 이상해졌다.
패킹이 된 걸 인지했나 보다,, 정확히 CRC 코드인지는 잘 모르겠지만 일단 언팩 파일로는 알 수 없을 것 같아서 그냥 패킹된 상태의 파일로 진행해주었다.
X32디버거를 사용해서 열어주었다.
위의 PUSHAD에서 조금만 내려오다 보면 POPAD를 찾을 수 있고, OEP로 점프하기 전에 연속된 PUSH값이 Stolenbyte이므로 위의 그림에서 회색으로 표시된 부분이 Stolenbyte라고 쉽게 알 수 있었다.
Stolenbyte : 6A0068002040006812204000
이제 OEP를 찾아야 하는데 POPAD에 BP를 걸고 내려오다 보니, JNE 부분에서 ESP와 EAX 값이 같지 않아서 JMP까지 갈 수가 없다.
그래서 오른쪽의 레지스터 창에서 ESP 값을 EAX와 같도록 바꾸어 주고, F8을 눌러서 진행하니 JMP까지 내려올 수 있었다!
이제 그대로 40100C로 이동해보았다.
누가 봐도 OEP스럽고 메인 함수스러운 부분이 나왔다.
여기서 문제 끝!이라고 생각하면 참 어리석었다.
살짝 화면을 올려보면 12개의 nop이 쭉 있는 것을 볼 수 있다.
검색해보니 어셈블리어에서 빈 공간을 채우기 위한 용도로 아무 의미 없는 nop을 이용한다고 하는데 하나 당 1byte씩 차지한다고 한다.
그럼 현재 12바이트가 채워져 있다는 이야기인데, 위의 stolenbyte를 잠깐 가져와보았다.
Stolenbyte : 6A0068002040006812204000
6A 00 68 00 20 40 00 68 12 20 40 00
딱 12바이트가 맞는 것을 알 수 있다.
즉, 정리하자면 우리가 OEP라고 생각했던 40100C위에 12바이트의 Stolenbyte를 위한 공간이 있고, 제대로 실행할 경우 해당 부분에 stolenbyte가 채워져서 실행될 것이라고 생각할 수 있다.
그러니까 다시 말해서 Original Entry Point는 40100C가 아닌, Stolenbyte부터 시작하는 401000이라는 것을 알 수 있다.
[FLAG]
OEP : 00401000
Stolenbyte : 6A0068002040006812204000
'Reversing > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L14풀이 (0) | 2021.09.13 |
---|---|
[CodeEngn] Basic RCE L12풀이 (0) | 2021.08.18 |
[CodeEngn] Basic RCE L10풀이 (0) | 2021.08.18 |
[CodeEngn] Basic RCE L09풀이 (0) | 2021.08.18 |
[CodeEngn] Basic RCE L08풀이 (0) | 2021.08.18 |