이 글은 윈도우 시스템 해킹가이드 버그헌팅과 익스플로잇을 보고 정리한 글입니다.
자 이론적으로 dll base와 offset을 구하는 방법을 알앗으니 내 컴퓨터에도 그렇게 되있나 확인을 해봐야겟죠?
우선 pe view와 windbg가 필요해요
자 dll base부터 확인해보도록 하죠.
windbg를 처음 사용하시는 분이시라면 심볼 서버 연동하는법을 검색하셔서 연동하시고 오시면 감사하겠습니다.
자 windbg로 간단하게 Program Files\Internet Explorer\iexplore.exe를 열어 줍니다.
자 그러면 심볼연동까지 하고 나시면 위와같이 !teb명령어로 내 컴퓨터의 teb위치를 확인해 줍니다.
자 제 teb주소값은 7ffdf000이네요. 모두 저 Self: 에 있는 주소가 본인의 주소입니다.
자 이제 실제 teb와 저주소값을 매칭시켜서 안의 구조체를 확인해봅시다. +0x030에 PEB주소가 있는게 보이시죠? 제 PEB주소는 0x7ffdd000이네요.
자이제 PEB 구조체를 확인하니 +0x00C에 LDR이 보이네요. 0x76fb8880에 _PEB_LDR_DATA 의 주소 값이 있네요.
자 이제 +0x014를 보면 InMemory OrderModuleList가 보이네요 다음 주소는 저기겠죠? 자 여기서 주의할 점은 InMemory OrderModuleList는 더블링크드리스트라고 제가 말했었는데요. 이 주소는 다음 _LDR_DATA_TABLE_ENTRY를 가르키고 있는게 아니라 다음 _LDR_DATA_TABLE_ENTRY의 InMemory OrderModuleList를 가르키고 있습니다. 지금은
분석을 하고 있는 것이니까 다음 구조체를 확인해보기위해 저 주소에서 -8만큼 해줄게요. 저 같은 경우에는 0x461ab8-8이겠네요
자 왜 8인지 이해가 안되시면 위에 LDR_DATA_TABLE_ENTRY의 구조체를 잘 보시면 _PEB_LDR_DATA 와 달리 +0x08 자리에 InMemory OrderModuleList가 있죠? 그냥 저 주소값을 따라가면 저 InMemory OrderModuleList 주소 값이기에 -0x08을 해야 구조체의 위치가 나오는 거에요. 나중에 코딩할때 이부분 많이 헷갈리시니 꼭 기억해주세요.
여기서 위의 사진을 보면 DLLBase가 있죠? 여기서 찾았다고 생각하실수도 있지만 빝에 basedllName을 잘 보시면 여기는 우리가 찾는 kernel32.dll이 아니라 iexplore.exe네요. 저희가 분석한 프로그램이 iexplore.exe엿죠? 실행파일 본인이 나왓네요. 저희는 kernel32.dll 을 찾는 거니까 다음 주소로 가볼게요.
자 여기도 ntdll.dll 이네요 다음으로 갈게요.
자 드디어 커널32.dll을 찾앗네요. 커널 dllbase의 주소값은 0x76040000이었습니다. 여기서 이값은 컴퓨터 재부팅시 어차피 바뀌게 되니 어떤방식으로 찾앗고 이런 구조인 것을 기억해주세요!!
사실 저희는 구조를 알기 위해 이렇게 한것이지. 실제로 dllbase는 windbg 에서 !dlls명령어로 간단히 알수 있습니다.
자 바로 나오죠? 하지만 구조를 알아야 universal shellcode를 만들수 있으니 까먹지 말고 기억해주세요.
자 다음은 offset을 구해보도록 할게요. 자 우선 peview를 여시고 WINDOW\STSTEM32\kernel32.dll을 열어 주세요. 그리고 IMAGE_DOS_HEADER의 가장 아랫부분인 OFFSET TO NEW EXE HEADER를 봐주세요.
저는 F0값이네요. 자 커널 주소에서 저 값 만큼 더한게 NT헤더의 주소에요. 우리는 IMAGE_OPTIONAL_HEADER에 있는 DATA TABLE을 가야하기 때문에 NT헤더에서 시그니쳐 4 + 파일헤더 14를 더해 +0x18 만큼 해주시면 IMAGE_OPTIONAL_HEADER주소 값입니다.
즉 DLLBASE( 0x76040000)+0xF0=NT헤더 +0x18(시그니쳐+파일헤더) = IMAGE_OPTIONAL_HEADER
가 됩니다. 즉 0x76040000+0xF0+0x18=IMAGE_OPTIONAL_HEADER입니다.
자 이제 여기서 +0x060에 Export_directory가 있습니다. 자 여기 값을 보죠. 여기 들어있는 값은 RVA입니다. 즉 상대주소란 거죠 EXPORT 테이블까지의 Offset을 확인해봅시다.
000b59e4값이 여기까지의 오프셋인것을 확인할 수 있습니다. 왜 여기에 들어있는게 오프셋인지 이해가 안되신다면 pe view에서 구조를 한번 보고 오시는 것을 추천드리겠습니다.
자 이제 dllbase+offset에 들어있는 값을 보도록 하겠습니다. 0x76040000+0xF0+0x18+0x60을 하면 되는거 아니냐고 생각하시면 절대 안됩니다. 0x76040000+0xF0+0x18 이 주소에 상대주소가 들어가 있는 거지. 저주소와는 달라요. 헷갈리
시면 안되요.
자 이제 이것들을 보면 저기 빨간 줄이 쳐져 있는게 맨위 오른쪽부터 함수주소,함수명,서수 배열입니다.
이러한 값들도 peview로 보면 쉽고 간편하게 볼 수 있습니다.
자 peview로 함수명배열을 한번 살펴보자. 여기서 우리는 찾고자하는 함수의 순번과 서수테이블에 잇는 그 값과 그 값을 넣은 함수주소가 일치하는지를 봐야한다. 우리는 ActivateActctx를 예로 살펴보고자 한다. ActivateActctx는 2번째에 위치한다.(0,1,2) 그럼 서수테이블의 인덱스가 2일때의 값을 살펴보자.
서로 0005로 VALUE값이 일치한다. 자 이제 서수테이블[2]의 VALUE=5이므로 우리는 ADDRESS[4]를 확인해서 ActivateActctx가 맞는지 확인해야 한다.
자 다 일치한다. 이것을 WINDBG로도 한번 살펴보자.
Ordinal Table의 주소값은 dllbase + EOT Offset이므로 아까 구한 서수배열인 0xb84b4를 더해준다.
2번째 인덱스 값이 4인것이 확인됫다.
이제 함수주소 테이블로가서 4번인덱스를 확인해보자.
0x455b5로 peview로 확인한것과 일치한다. 이 offset이 최종적으로 우리가 구할려고 하는 offset이다.
즉 function address=dllbase(0x76040000)+ offset(0x455b5)를 하면 함수 주소를 구하는 것이다.
다음에는 이때동안 한 것들을 이용하여 universal shellcode를 제작하는 것과 어떻게 함수명테이블에서 함수명을 비교하는지에 대해서 알아보도록 하겠다.
'System' 카테고리의 다른 글
포트바인딩 쉘코드 (0) | 2020.07.30 |
---|---|
Universal Shellcode(4)-실습 (0) | 2020.07.20 |
Universal Shellcode(2) - offset 구하기 (0) | 2020.07.18 |
Universal Shellcode (1) (dll 시작주소 알기) (0) | 2020.07.18 |
쉘코드-널바이트 제거 (0) | 2020.07.18 |