Iriton's log

[CodeEngn] Basic RCE - L10 본문

Reversing/Wargame

[CodeEngn] Basic RCE - L10

Iriton 2023. 11. 21. 14:45

OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오.

정답인증은 OEP + OPCODE

EX) 00400000EB03

 

필요 개념 정리

  • ASPack 패킹: PUSHAD → 복호화 코드 실행 → POPAD → Return 0C → OEP 값 PUSH → Return으로 OEP 주소로 이동
  • ASPack 언패킹하는 법-하드웨어 BP를 이용하여 언패킹하는 법
  • -RET C를 찾아 OEP를 찾는 법
  • PUSHAD: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 레지스터의 값을 스택에 저장
  • 레지스터들의 값을 보관해야 할 때 사용
  • POPAD: PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용
  • RET(RETN): CALL을 통해 호출된 함수에서 다시 복귀하기 위해 사용하는 명령.ESP 레지스터가 가리키는 값을 EIP 레지스터에 저장한다. 복귀주소를 기억하고 그 주소로 점프하는 것이다.EIP의 내용은 직접적인 수정이 안 되기 때문에 문법적으로는 바르지 않음으로 개념적으로만 알아두자.
  • 스택에 저장된 정보를 기반으로 흐름이 바뀌는 것이기 때문에 의미상으로는 POP EOP와 동일하지만
  • 즉, 함수 중단 후 CALL이 호출된 함수로 돌아간다.
  • 레지스터: CPU 속에 있는 고속 기억 장치, 연산 수행을 위해 메모리에 있는 데이터를 레지스터로 가져와서 연산
  • ESP: Stack의 끝지점 주소를 가르킨다.
  • PUSH, POP 명령 실행시, ESP 값이 4바이트씩 커졌다 작아졌다 함.
  • Stack: 메모리의 한 부분, 먼저 들어간 게 최후에 나가는 특별한 자료구조(LIFO)
  • PUSH: 데이터를 스택에 집어넣는 명령어
  • POP: 데이터를 스택에서 꺼내는 명령어
  • HWBP: 하드웨어 브레이크 포인트 - 디버거 레지스터에 BP를 설정하고자 하는 주소를 입력한다.데이터 크기 지정도 가능. (Byte, Word, Dword)
  • CPU 주소에 BP를 거는 것이며 BP를 만나게 되면 CPU는 디버거에게 제어권을 준다.
  • 명령어 뿐만 아니라 메모리에도 BP 설정 가능하단 장점. 즉, 프로세스에 의해 직접 실행되는 명령어 뿐만 아니라 실행되지 않는 메모리에 저장된 데이터에 BP 설정할 수 있음.
  • SWBP: 명령어에 BP를 거는 것인데 BP를 걸어둔 명령 전에 INT 3 명령어(디버거가 실행 중인 프로그램에 BP를 설정하기 위한 명령어)로 다시 쓰기 되어서 디버거에 의해 제어된다.

문제 풀이

문제에서 OEP를 구해야 한다고 이야기 했으니 패킹 되어 있단 것을 예상할 수 있었다.

(OEP는 패킹된 파일의 실제 프로그램 시작 부분을 의미하니까)

PEiD로 확인해 보니 ASPack으로 패킹되었다고 뜬다.

 

여기서 ASPack의 특징은 아래와 같다.

PUSHAD -> 복호화 코드 실행 -> POPAD -> Return 0C -> OEP 값 PUSH -> Return으로 OEP 주소로 이동

이 점을 이용하여 언패킹을 하면 된다.

 

 

구글링을 통해 아래와 같은 말을 봤다.

“PUSHAD 명령 실행 이후 ESP 값을 접근하는 지점에 BP를 걸어두면 OEP를 분기하기 전으로 이동할 수 있다.”

이 말을 완전히 이해하기 힘들어서 PUSHAD 명령과 하드웨어 BP에 대해 알아봤다.

 

 

먼저, PUSHAD는 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 레지스터의 값을 스택에 저장하는 명령어이다.

즉 PUSHAD 명령이 실행되면 앞서 말한 ESP(스택의 끝지점 주소)에도 값이 저장된다.

 

그 후 ESP 주소는 POPAD 명령어를 실행할 때 접근하게 되는데 그 이유는 POPAD 명령어가 PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용되기 때문이다.

HWBP(HardWare Break Point)는 CPU 속의 주소에 BP를 거는 것이다. 즉 PUSHAD를 실행시킨 뒤 ESP 값에 BP를 걸어두면 나중에 다시 ESP에 접근하는 지점에서

브레이크가 걸린다. 그 지점이 바로 POPAD이다.

 

F8을 이용해 PUSHAD 한 줄만 실행시킨다.

 

그 후 ESP 값의 주소에 BP를 걸면 된다.

 

[우클릭 - Follow in Dump]를 이용해 ESP가 가리키는 메모리 주소를 확인한다.

 

우클릭하여 BP를 걸어주면 된다. 이때 Dword는 4바이트 인데 메모리 크기를 4바이트로 지정한다 라는 뜻이다.

 

그 후 실행시키면 JNZ 명령에서 브레이크 된다.

명령어를 살펴보면 JNZ 구문에 의해 분기문이 시작되고 PUSH 명령어로 00445834 주소를 스택에 저장한 후, RETN 명령이 실행되는 것을 알 수 있다.

 

RETN 함수를 실행시키니 00445834 주소로 돌아왔다.

이 화면은 올리디버거가 분석하지 못했을 때 나타나는 화면이라고 한다.

여기서 Ctrl+A를 눌러주면 언패킹이 완료된다.

 

OEP는 00445834가 된다.

 

이제 OPCODE를 찾아야 한다.

작동되지 않는 exe 파일이라 어떻게 찾을지 잘 모르겠지만 텍스트를 확인하여 성공할 때 뜰 만한 문구를 찾았다.

[우클릭 - Search for - All referenced text strings]를 이용한다.

 

Registered well done!이 성공했을 때 뜨는 문구로 추정되어 더블클릭했다.

위를 둘러보니 점프문이 있었다. 이 점프문에 걸릴 경우 성공 메세지 부분을 뛰어넘게 되니 이 코드가 등록 성공으로 가는 분기점을 알 수 있으며 OPCODE는 75 55이다.

OEP + OPCODE: 004458347555

'Reversing > Wargame' 카테고리의 다른 글

[CodeEngn] Basic RCE - L16  (1) 2023.11.21
[CodeEngn] Basic RCE - L15  (1) 2023.11.21
[CodeEngn] Basic RCE - L09  (1) 2023.11.21
[CodeEngn] Basic RCE - L08  (1) 2023.11.15
[CodeEngn] Basic RCE - L06  (0) 2023.11.15
Comments