main함수 위치를 찾는방법
가끔 목적지을 바라보지만
반대방향으로 가고있는
고장난 네비게이션(나)을 발견합니다.
분석할 때도 마찬가지입니다.
그래서!
바이너리 내에서 메인함수에 가기위한
이정표를 만들어볼까 합니다.
그 전에 분석을 하기 위해서는
분석 툴이랑 친해져야겠죠?
올리디버거와 이뮤니티 디버거의
단축키를 보겠습니다.
이정도만 익숙해지기로 하고 메인함수를 찾으러 갈게요.
메인함수로 가는 길
1. stub code를 지나기
stub code인지 아는 방법은 call을 만날 때마다
[F7]을 눌러서 들어가보고 실행되야 하는 함수가 보이지 않으면
[Ctrl + F9]를 눌러서 RETN까지 실행합니다.
7ip. 만약 CALL Kernel32.*가 있다면 우선은 패스하는 것을 권장합니다.
이유는 그 API의 내부 구현이 어떻게 되는지는 지금 궁금한 것이 아니기 때문이죠!
메인함수를 찾았다면 [F2]를 눌러 BP(breakpoint)를 걸어놓고
추후 [Alt + B]로 BP목록을 확인하거나,
[;]을 눌러 주석을 달아놓고
[우클릭 - Search for - User-defined comment]를 눌러
주석목록을 확인할 수도 있습니다.
2. 문자열 검색
[우클릭 - Search for - All referenced text string]을 누르면
해당 섹션에 있는 문자열을 확인할 수 있습니다.
원하는 문자열이 있는 곳이 아마 메인함수겠죠?
단, 앞으로 보는 대부분의 프로그램은 이런식으로 찾기는 힘들거에요!
3. API 검색
[우클릭 - Search for - All intermodular calls]를 누르면
해당 섹션에서 사용된 API call을 보여줍니다.
프로그램 시작 시 특정 API가 호출된 것을 알고 있을 경우
해당 위치로 이동하기 좋겠죠?
단, 패커나 프로텍터에 의해 실행압축이 된 파일이라면 이와 같은 방식으로 API목록 확인은 힘들거에요!
프로세스는 OS에게 API를 요청할 것이고 API가 구현된 dll은 메모리에 로딩되기 때문에
프로세스 메모리에 로딩된 라이브러리(lib)가 가리키는 dll에 직접 BP를 걸어보세요.
[Alt + M]으로 로딩된 dll목록을 확인할 수 있습니다.
[우클릭 - Search for - Name in all modules]를 누르면
로딩된 dll이 제공하는 모든 API를 확인할 수 있습니다.
여기서 바로 원하는 API를 검색하면 바로 검색이 됩니다.
이렇게 말이죠!
여기에 BP를 걸고 실행하시면 메모리에 실행압축된 내용이 풀리고
MessageBox 실행 전에 멈추게 됩니다.
※ 궁금증
올리디버거는 호출된 API의 이름과 주소를 어떻게 알 수 있을까요?
우선 IAT(Import Address Table)라는 것이 있습니다.
어떤 라이브러리에서 어떤 함수를 사용하고 있는지 정의해 놓은 테이블
정도로 정의하겠습니다.
같은 영역 안에 있는 함수라면 호출이 가능하지만
User32.dll이 어디에 로드될지 모르는데
그 안에 있는 Messagebox의 주소는 당연히 알 수 없겠죠?
그러나 올리디버거는 똑똑이기 때문에 IAT를 참조해서 찾아주는 것 입니다.
실제로 어떤 함수든 call을 할 때 IAT에 call을 합니다.
IAT에서 내 기준주소로부터 얼마나 떨어져 있는지(offset) 알려주지요.
그리고 그 함수로 이동 후 실행을 합니다.
조금 더 설명을 하면
프로그램이 메모리에 로드될 때 필요한 dll을 로드하고
dll을 로드할 때 원래 쓰려고 했던 함수를 IAT에 채워주게 됩니다.
IAT뿐만 아니고 INT(Import Name Table)도 마찬가지입니다.
'Try Attack > Reverse Engineering[basic]' 카테고리의 다른 글
PE재배치 (0) | 2020.03.23 |
---|---|
EasyCrackMe - reversing.kr (0) | 2020.03.12 |
PE 파일 포맷 (0) | 2020.01.21 |
파일을 입력받는 프로그램의 취약점분석 및 공격 (0) | 2019.11.12 |
Virtual address (0) | 2019.07.12 |
댓글