알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
UPX packing 과 unpacking (2) 본문
UPX packing 과 unpacking (2)
이번에는 UPX 로 패킹된 파일을 디버거로 열어 보겠습니다.
UPX 로 패킹된 파일
원래 notepad 파일
많이 다릅니다.
upx 패킹된 파일은 압출된 코드를 압축 해제 하는 코드 부터 시작 되게 됩니다.
여기서 우리가 원하는 코드의 디버깅을 하기 위해서는 notepad 의 원래 실행 코드까지 접속 해야 합니다.
그럴려면 UPX 에서 압축이 해제 되고 실제 코드가 실행 되는 부분을 잡아 내야 됩니다.
그러한 부분을 잡는 공부 하고자 합니다.
일단 압축이 풀리는 부분을 보겠습니다.
ctrl + F8 을하면 자동으로 step over 트레이싱이 일어 납니다.
그러면 계속 해서 반복되는 LOOP 를 만날수 있습니다.
그럴때는 반복 되는 코드가 무엇을 의미하는지 추리 하고 그 역확을 알아봐야 합니다.
이부분과
이부분에서
앞에서 봤던 UPX0 번 세션
메모리의 변화가 있는 것을 알수 있습니다.
edi 레지스터와 esi 레지스터 를 이용해서 메모리를 변화 할수 있는것을 알수 있습니다.
측 무언가 압축을 해제하여 데이터를 쓰고 있다는것을 알수 있습니다.
일단 이 LOOP의 목적을 알았으니
탈출 하겠습니다.
루프의 밑에 보면 JMP 코드 밑에
pop esi 라는 곳에서
다른 곳에서 분기를 받아 오는 부분이 있습니다.
다른 부분의 브레이크 포인트를 모두 해제 하고
거기에만 BP(브레이크 포인트를 걸고 F9를 눌러 압축 해제 까지 실행 시키겠습니다.
이렇게 메모리에 압축이 풀린것을 볼수 있습니다.
그럼 계속 해서 F8 로 실행 하겠습니다.
다음 LOOP를 여기서 만나게 됩니다.
CMP 로 뭔가 계속 비교 하는데 무결성을 체크 하는것으로 추측 됩니다, 그럼 해당 코드도 탈출 하겠습니다.
loop 명령어
다음에 BP 를 걸고 F9을 눌렀습니다.
그리고 F8로 다시 트레이스 하겠습니다.
그럼 LoadLibrayA 와 GetProcAddress 을 하는것을 볼수 있는데
IAT 테이블을 만드는 작업을 하는것으로 생각할수 있습니다.
그러니 해당 LOOP 건너 뛰겠습니다.
루프 를 벗어 나고 좀 밑으로 코드를 내리면
popad 명령어를 통해서 스택을 정리하고
이것은 UPX 에서 사용 하던 스택 정보를 원래 데로 돌리기 위해 필요한 작업이죠 .
JMP 하는 코드가 있습니다.
점프를 하고 난뒤에 코드를 보면
그리고 압축 하기전에 코드를 보면
똑같은것을 알수가 있습니다.
이로써 원래 notepad의 코드를 찾을수 있었습니다. ~!
2번째로 해당 포인트를 빨리 찾는 방법은
패커 초반에
pushed 로 스택을 쌓는 부분이 있습니다.
나중에 패커 함수가 완료된다음 원래 상태로 돌아가기 위해서 스택을 정리하는데
pop 이 필요 합니다.
그때 스택에서 사용하는 메모리에 하드웨어 브레이크를 걸어 두면
해당 메모리를 접근할때 브레이크가 걸리게 하드웨어 포인트를 4개 지원합니다.
popad 에서 브레이크가 걸리게 됩니다.
'리버싱' 카테고리의 다른 글
C# packet 캡쳐 하기 (0) | 2018.12.07 |
---|---|
C# 직렬화(Serializable) 통신 패킹된 파일 구조 맞춰 주기 (0) | 2018.07.03 |
UPX packing 과 unpacking (1) (0) | 2018.05.28 |
C# dll injection 오픈소스 사이트 공유 (0) | 2018.05.27 |
windows 후킹에 관련되 좋은 자료 공유 (0) | 2018.05.27 |