PEview툴을 사용해 프로그램의 Import address table을 확인해 보자.
Windows API에 관련된 함수들을 가지고 있다.(Process, dr\aw text, AndPoint..)
올리디버그로 보면 GetModuleHandleA인 windows api을 볼 수 있다.
여기를 통해서 윈도가 할 수 있는 명령어들을 많이 실행한다.
GetModuleHandleA에 들어가면 포인터를 가지고 점프를 하는 걸로 보인다.
포인터가 어디인지 보려면 밑에 402000에 저장이 되어 있고. 7080B741이라느 숫자가 저장되어 있다.
Ctrl + G 누르고 402000으로 이동을 해보자.
덤프창에서 보면 Import address table이다
PEview툴에서 볼 수 있다.
결론은 현재 프로그램을 올리디버그에서 볼 때 두 번째 줄에서 GetMoudleA를 호출한다는 사실을 알 수 있다.
여기 CALL에서 바로 7C80B741로 콜 때리면 되는걸 왜 굳이 402000에다가 써놓았을까? -> 호환성 때문이다(old version을 업데이트하더라도 프로그램들이 잘 돌아가도록 해주는 것)
하드코딩을 하면 안 되기 때문에 Import table의 주소에 따라 로드되는 시점에 현재의 운영체제에 맞게끔 참조되는 데이터가 바뀐다.
* UPX 프로그램을 언패킹 해보자.
바로 PUSHAD가 나오는 걸 봐서 ESP를 통해서 확인하면 되겠다는 사실을 알 수 있다.
F8로 실행 후, 덤프창에서 esp로 이동을 해준 다음 Dword 브레이크 포인트를 걸어준다.
F9로 실행을 하면 건드린 다음 멈추기 때문에 POPAD에서 건드렸다는 사실을 알 수 있다. 그다음 401000으로 점프를 한다.
메모리 영역을 보면 401000은 UPX0부분이다.
F8을 눌러 401000으로 오면 여기가 OEP라고 볼 수 있다. 그 다음 Plugins에서 Ollydump를 실행시켜 덤프를 떠준다.
Import REC툴을 이용해 덤프 된 프로그램에 올바른 improt table을 적용시켜 줄 것이다.
사용방법 : 압축이 풀린(정상적인 upx 프로그램을 실행된 상태에서(올리디버그) ) REC툴에 있는 IAT AutoSearch 버튼을 눌러준다. -> OEP을 1000으로 수정해 준다. -> get imports을 눌러준다. -> Fix Dump로 덤프 한 프로그램을 고쳐준다.
정상적으로 실행이 될 것이다. 고치기 전 덤프한 프로그램은 실행이 안된다.
'모의해킹 > 리버싱' 카테고리의 다른 글
API 리다이렉션을 활용한 언패킹 방해 기법 우회 (0) | 2023.10.19 |
---|---|
패커와 프로텍터 : 레나 챌린지 (Level 20) (0) | 2023.10.02 |
IsDebuggerPresent를 사용한 안티디버깅 방법 : 레나 챌린지 (Level19) (0) | 2023.10.01 |
난독화 코드 해석과 패치 방법 : 레나 챌린지(Level18) (0) | 2023.10.01 |
키 생성기(키젠) 만들기 : 레나 챌린지(Level17) (0) | 2023.09.30 |