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 |