문제 설명

개념 설명
OEP:
Original entry point
언패킹을 할 때 가장 중요한 부분(프로그램 시작주소)
upx로 압축을 하면 PUSHAD와 POPAD가 한 쌍이 된다.
PUSHAD실행 후 맨 위의 스택 주소를 덤프하여 브레이크 포인트를 지정한다.
다시 실행하면 POPAD에서 멈추게 되는데 이때 JMP에 있는 주소가 OEP가 된다.
ASPACK: 단순 암호화목적을 위해 만들어짐
*UPX: 오픈소스로 압축을 목적으로 만들어짐
힌트: PUSHAD, POPAD찾기 / ESP값 변화 잘 확인
PUSHAD로 레지스터들을 스택에 저장해놓고,
원본 코드가 모두 복구되면 메모리에 POPAD를 통하여 다시 레지스터값을 참조
이 점을 이용하여 PUSHAD 후 ESP값에 접근하는 지점에 BP를 걸어놓으면 쉽게 OEP로 이동가능
분기점: 비교후 0이 아니면 점프하거나,0이면 점프한다 -> jnz,je,jz..등등
문제 풀이
일단 DIE에 넣어보자.

UPX로 압축되어있지 않은데, 압축형식을 확인해보니 ASPack이다.
앱을 이용해서 압축을 풀어주도록 하자.
VMunpacker를 이용해주면 된다.

해당 파일을 넣고 압축을 풀어주자.
압축이 풀렸다. 이제 압축이 풀린 파일을 디버거에 넣어보자.

일단 OEP는 00445834인 것을 알 수 있다.

일단 실행시켜보니 따로 뜨는 창은 없고, 해당 위치로 이동된 것을 알 수 있다.
*따로 실행시켜보니 해당 창이 떴다

'등록성공'으로 가는 분기점으로 가라 했으니 일단 text string을 살펴보자.

뭔가 name에 대한 흰트와 well done이 쓰여있다.
일단 well done이 있는 곳으로 가보자.

well done이 나오면 성공일 테니까 분기점은 00445501이 아닐까? 해당 OPCODE는 E8 A6F5FDFF이다.
00445834E8A6F5FDFF
틀렸다. 분기점은 비교후 0이 아니면 점프하거나,0이면 점프한다 ->jnz,je,jz..등등이라고 한다.
다시 분기점을 찾아보자.

JNZ 명령어를 사용하는 것 보니 여기인 것 같다.
004458347555
정답이다.
'Reverse Engineering > CodeEngn Basic' 카테고리의 다른 글
| [리버싱] CodeEngn Basic RCE L14 (0) | 2024.09.25 |
|---|---|
| [리버싱] CodeEngn Basic RCE L11 (0) | 2024.09.25 |
| [리버싱] CodeEngn Basic RCE L09 (0) | 2024.09.24 |
| [리버싱] CodeEngn Basic RCE L07 (0) | 2024.09.20 |
| [리버싱] CodeEngn Basic RCE L08 (0) | 2024.09.19 |