UPX Pakking principle
실행압축?
Analysis
[ not pakking.exe Section ] [ pakking.exe Section ]
하지만 virtual size는 6000이나 엄청 크다는 것을 볼 수 있습니다.
그렇다면 UPX1에는 압축해제 코드와 원본 데이터가 들어가있다는 것을 예상할 수 있습니다.
그리고 압축해제된 데이터는 upx0에 들어갈 것 같다는 예상을 할 수 있습니다.
그렇다면 이제 올리디버거를 열고 동적 분석을 시작하도록 하겠습니다.
프로그램 실행 전 레지스터와 스택의 상황입니다.
PUSHAD 명령어가 실행된 뒤의 스택의 상황입니다.
PUSHAD 명령어는 레지스터의 모든 값들을 스택에 집어넣습니다.
ESI와 EDI를 첫번째 섹션과 두번째 섹션 주소로 세팅합니다.
ESI = UPX1
EDI = UPX0
아까 위에서 봤듯이 virtual size는 6000이였음을 보았습니다.
딱 UPX0과 UPX1의 차이가 6000임을 눈으로 직접 볼 수 있습니다.
이 부분은 UPX0 섹션의 데이터 1byte씩 읽어와서 집어넣는 부분이다.
[ UPX1 섹션 데이터 값들 ]
[ UPX0 섹션에 데이터가 차곡차곡 들어간 값들 ]
[ 압축해제 루틴 ]
IAT 복구
함수 이름을 UPX0에서 가져온 뒤 GetProcAddress 함수를 이용해서 함수의 주소를 읽어온다.
그리고 EBX가 가르키는 주소에 함수의 주소를 저장한다.
이제 모든 코드를 압축해제하면 upx0 주소로 점프하는 것을 볼 수 있습니다.
'0x20 Security > 0x22 Reversing' 카테고리의 다른 글
PE File Format (310) | 2016.07.23 |
---|