블로그 이전했습니다. https://jeongzero.oopy.io/
[reversing.kr] easy unpack
본문 바로가기
카테고리 없음

[reversing.kr] easy unpack

728x90

1. 문제


1) 문제 확인

ReversingKr UnpackMe


Find the OEP

ex) 00401000

OEP를 찾으라고 한다. OEP는 Ordinaly Entry Point 로 패킹된 바이너리들은 실행되기 전에 언팩 과정을 거쳐야 한다. 특정 언팩 루틴이 수행되고 정상 바이너리 흐름이 시작되는 곳이 바로 OEP다.

우선 die 에 넣어서 간단한 확인을 해봤다. 엔트리 포인가 0x40a04b 로 보인다. 아마 저 부분부터 타고 들어가서 언팩하는 로직을 찾아야 할것같다

2. 접근방법


0x40a04b 부터 확인을 해보자 (여기는 .GWan 영역이다)

초기에 kernel32.dll 을 LoadLibrary() 로 가져와서 기본적인 함수들을 사용하기 위한 세팅을 한다. 그 후 getmodulehandleA(0) 를 호출하여 자신 프로세스의 핸들을 가져온다.

그다음 0x409000 주소부터 한바이트씩 xor 연산을 하며 0x4094ee 의 값과 비교를 한다.

0x409000 영역은 .Gogi 라는 section이다. 해당 섹션에는 현재 다음과 같은 값이 들어가 있다

루틴이 끝난후에는 xor 연산을 통해 어떻게 변경되었는지 확인해보자

아스키 값을 잘 보면 함수 이름들이 보인다. 아마 .Gogi 섹션에 필요 함수들을 패킹해서 못보게 해논것 같다. 그럼 이제 분명 해당 영역을 뒤에서 사용할 것이다. 일단 마저 분석해보자.

0x405000 영역을 virtualprotect() 함수를 통해 쓰기, 읽기 권한을 할당하고 0x405464, 0x409003 주소를 가져온다. 그다음 0x409003 의 값을 0x405464에 복사한다.

0x405464 영역은 Import Directory 가상주소로 원래 pe에서 함수 주소를 얻어오는 과정에서 참조하는 주소인데(INT), 현재는 패킹되었기 때문에 해당 영역을 복구시키는 로직인것 같다.

또 쭉 진행하면

edx에 들어있는 함수이름을 가져와서 getprocadress()를 통해 함수 주소를 구한다. edx는 0x409136 영역이고 해당 영역은 위에서 xor 연산을 통해 복구시킨 .Gogi 섹션이다.

0x40936을 보면 0x4050a4 주소가 들어가 있다. 즉 복구시킨 .Gogi 섹션의 값들에는 함수들의 정보들이 들어가 있고(IAT 복구라고 보면 될듯) INT를 참조하여 해당 함수의 주소를 구하고 아까 쓰기 권한을 추가한 0x405000 ~ 영역에 복사하는걸 볼 수 있다.

그 다음을 보면 0x401000 부터 0x405000 까지의 권한을 다시 설정 즉 복구를 진행하는데, 해당 영역은 .text 영역인걸 알수있다.

또 밑에선 0x406000 ~ 0x409000 까지의 설정을 복구하는데 이는 .data 영역이다. 이로보아 .text 영역과 .data 영역을 따로 복구시키는것을 알수 있다. 해당 과정이 끝나면 이제 0x401150으로 뛴다.

여기가 바로 모든 언팩과정을 거치고 실제 실행되는 oep 위치이다.

3. 풀이


oep 찾는 시나리오는 다음과 같다

  1. .Gwan이라는 영역으로 EntryPoint를 바꾸어 복구 로직에 진입한다.
  1. .Gogi라는 섹션의 데이터는 리소스 데이터 등이 들어있는 영역으로, 해당 영역을 복구시킨다.(xor 연산을 통해)
  1. .Gogi 섹션에 들어있던 INT를 원본 Import Directory 데이터에 덮어씌워 복구시킨다.
  1. IAT 구조를 복구하기 위해서 저장되어있는 해당 함수의 INT 배열에 대한 인덱스, 함수 이름 등을 이용해 실제 실행 주소를 원래 IAT 위치에 기록한다. (0x405000 ~)
  1. 코드영역과 데이터 영역을 복구한 이후에 OEP로 EIP를 돌린다.

4. 몰랐던 개념


PE 구조 다시 공부해야겠다.. IAT, INT 존나 헷갈리네 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

로더가 어케 함수 주소 얻어오는지 다시 공부하자..

참고자료

728x90