본문으로 바로가기

[D+10] 패킹&언패킹 (2)

category 해킹&보안/리버싱 2017. 4. 12. 20:03
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

4. 패킹&언패킹


3) 수동 언패킹 (Manual Unpacking)


▣ 수동 언패킹

- OllyDbg를 사용하여 upx로 패킹되어있는 파일을 수동으로 언패킹함.

- OllyDbg는 처음 실행 시 Entry Point를 찾아서 첫 바이트를 0xCC(Interrupt)로 잠시 바꿔둠. 그래서 멈춰있는 것임.

☞ 직접 중단점을 설정할 때도 해당 줄에서 첫바이트를 0xCC로 잠시 바꾸기에 해당 줄에 멈춰있는 것임.

- OllyDump.dll : 패킹을 풀고 저장하기위한 plugin 


☞ 첫 줄에 PUSHAD는 프로그램 초기 실행시 레지스터 값을 백업하는 것임.

☞ 복호화 코드를 다 실행하고 OEP를 찾아서 떠날때 레지스터값들을 복원하기 위해 존재.

☞ PUSHAD가 있다는 말은 그에 대응하는 POPAD가 있을 확률이 큼.

☞ ESP를 우클릭후 Follow in Dump를 누름.


- Hardware Breakpoint : 메모리 상의 특정영역에 쓸 때, 접근할 때 등의 조건에 따라서 중단점을 검.

☞ Breakpoint를 걸 수 있는 개수가 제한.

☞ H/B.P들의 목록을 보기위해서는 Debug - Hardware breakpoints를 눌러야만 창으로 볼 수 있음.

☞ 중단점을 건 후 F9 키로 중단점까지 실행.

☞ 하드웨어 중단점은 해당 메모리를 읽기전이 아닌 읽고나면 멈춤.


☞ 누가봐도 JMP 명령어가 복호화를 끝내고 원본 프로그램의 EP로 점프하는 것을 알 수 있음.

☞ 해당 줄에 중단점을 걸고 실행하여 OEP를 찾음.


☞ 원본 파일을 얻어내기 위해 Dump debugged process를 누름.

☞ Modify 부분에 OEP를 적고 Build import 옵션은 건드리지 않는다. == Import 정보를 새로 싹 만든다.


- 위의 방법대로 프로그램을 저장하고 나면 내가 필요한 부분만으로 이루어진 오리지널 원본 파일은 아니다.

- 암호화된 코드와 복호화코드를 다 함께 저장하기 때문에 원본프로그램보다 파일크기가 조금 더 큼.

☞ 섹션이름은 UPX0, UPX1 ... 그대로 존재함. 바꾸려면 직접 바꿔줘야함.

☞ PEview로 언패킹한 파일을 열어보면 UPX0이 파일상 크기도 가지고 해당 섹션을 보면 정말 코드가 적혀있음을 확인가능함.

☞ 새로운 섹션을 만들어 import 정보들을 적어놓음. 그러나 Address Table은 원래 자리에 있음.

-> Address Table이 바뀌면 call 명령어의 주소값을 다 수정해야해서 귀찮으니 유지해놓음.



[TIP]

▶ 리버싱을 통해 프로그램을 분석할 때는 우선 패킹이 되어있는지를 체크.

▶ 패킹되어있다면 언패킹.

▶ 패킹되어 있지 않다면 분석범위를 정함(코드부분, C에서는 main함수부분 찾기)

▶ 디버깅을 통해 한줄한줄 실행해보며 화면에 값이 출력되는 것이 있다면 해당 줄에 해석해야할 코드부분이 있을 가능성이 큼!









i2sec 대구지점 23기 수료생.

'해킹&보안 > 리버싱' 카테고리의 다른 글

[D+12] DLL Injection (1)  (0) 2017.04.18
[D+11] 안티 디버깅  (0) 2017.04.17
[D+9] 패킹&언패킹 (1)  (0) 2017.04.11
[D+8] PE 구조  (0) 2017.04.10
[D+7] 함수호출규약  (0) 2017.03.30