Try Attack/Reverse Engineering[basic]

main함수 위치를 찾는방법

D4tai1 2020. 3. 2.

 

가끔 목적지을 바라보지만

 

반대방향으로 가고있는 

 

고장난 네비게이션(나)을 발견합니다.

 

 

분석할 때도 마찬가지입니다.

 

그래서!

 

바이너리 내에서 메인함수에 가기위한 

 

이정표를 만들어볼까 합니다.

 

 

 

그 전에 분석을 하기 위해서는

 

분석 툴이랑 친해져야겠죠?

 

올리디버거와 이뮤니티 디버거의

 

단축키를 보겠습니다.

 

[표1] 올리디버거/이뮤니티디버거 단축키

 

이정도만 익숙해지기로 하고 메인함수를 찾으러 갈게요.

 

메인함수로 가는 길

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

댓글