HO_9
HO9
HO_9
전체 방문자
오늘
어제
  • 분류 전체보기 (104)
    • Write Up (3)
    • WarGame (21)
      • The Lord of Bufferoverflow(.. (7)
      • The Lord of Sql Injection(L.. (1)
      • Pwnable.kr (1)
      • Pwnable.tw (0)
      • XSS GAME (6)
      • Pwnable.xyz (5)
    • SYSTEM HACKING (49)
      • 기법 (24)
      • 문제 풀이 (24)
    • CODING (2)
      • PYTHON (2)
    • WEB HACKING (1)
    • Plan (0)
    • PROJECT (0)
    • iOS (6)
    • ALGORITHM (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

  • .

인기 글

태그

  • JNDI
  • log4j
  • 취약점
  • 아파치

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HO_9

HO9

Windows Universal Shellcode - 이론
SYSTEM HACKING/기법

Windows Universal Shellcode - 이론

2021. 4. 2. 15:50
728x90

이 글은 윈도우 시스템 해킹 가이드 버그헌팅과 익스플로잇에 기반하여 작성했습니다.

 

 

 

 

 

 

Windows Universal Shellcode

1 이상의 운영체제에서는 부팅 시 kernel32.dll 상위 2byte의 값이 변경되므로

기존 shellcode 이용이 어려워진다. 이에 보완해서 나온 것이 universal shellcode다.

DLL Base의 주소와 함수의 Offset을 더하는 원리, Linux에서 aslr을 우회하기 위한 방법과 유사하다.

(+PE구조 분석을 이용해야 한다.)

(+추가적인 배경지식..)

 

Background Knowledge

TEB(Thread Environment Block)

현재 실행되고 있는 쓰레드의 정보를 담고 있는 구조체이다.

이러한 TEB의 주소는 FS 레지스터에 저장되어 있다.

FS라는 세그먼트 레지스터는 현재 쓰레드의 TEB를 지시하는데 사용된다.

많은 쓰레드 정보를 가지고 있지만 현재는 TEB+0x30에 있는 PEB주소를 이용할 것이다.

 

 

PEB(Process Environment Block)

TEB와 비슷하게 프로세스의 정보를 담아두는 구조체이다.

이 정보들 중에 프로세스에 로드된 PE Image를  이용할 것이다.

PEB+0xC주소에 LDR 값이 저장되어 있고 그 값은 _PEB_LDR_DATA를 가리킨다.

 

PEB_LDR_DATA는 여러가지 모듈중 하나이다.

PEB_LDR_DATA의 0x14에는 InMemoryOrderModuleList에는 프로세스의 PE Image들의 데이터가 저장이 된

LDR_DATA_TABLE_ENTRY 구조체의 더블링크드 리스트 시작주소가 적혀있다.

 

LDR_DATA_TABLE_ENTRY에는 여러가지 모듈 정보들이 있는데,

그 중에서 우리가 원하는 0x18의 DLLBase,모듈의 주소 값들이 저장되어 있다.

InMemoryOrderLinks의 FLINK를 따라가 보면 첫번째 로드된 라이브러리인

ntdll.dll정보가 있는 두번째 LDR_DATA_TABLE_ENTRY 볼 수 있다.

 

그 다음 또 FLINK를 따라가 보면 세번째 LDR_DATA_TABLE_ENTRY이 있고,

이 구조체의 DLL BASE에는 kernel32.dll의 주소가 담겨 있다.

 

이를 통해서 DLL Base값을 구할 수 있게 되었다.

 

 

.

.

.

Linux에서는 Base가 되는 주소를 구하면

라이브러리에 나와 있는 함수들의 Offset들을 더해주면 해당 함수가 나오게 되지만,

Windows의 DLL파일은 같은 DLL파일이더라도 운영체제 버전과 서비스팩에 따라서 값이 달라질 수 있다고 한다.

 

그래서 특정 함수 주소를 고하기 위해서는

kerenl32.dll PEHeader 분석 작업을 거쳐야한다.

이를 위해서는 Export 개념을 알아야한다.

 

 

Export

DLL은 PE Header에 어떤 함수를 Export하는지 정보를 담아 놓는다.

Offset에 대한 정보는 PE Header의 IMAGE_OPTIONAL_HEADER32의 DataDirectory 배열의 첫 번째 구조체인

Export Directory에 저장되어 있다.

 

 

Export Table에는 구조체로 이루어져 있으며 여러가지로 구성되어 있지만,

그 중 특정 함수 주소를 찾기 위해서는

AddressOfFunctions(함수 주소 배열(EAT)),AddressOfNames(함수명 배열),AddressOfNameOrdinals(함수 서수 배열)이

사용 된다.

 

아래 과정과 위의 정보들을 이용해서 실제 함수의 주소 값을 찾을 수 있게된다.

 

1.함수명 배열로 이동해서 원하는 함수의 이름과 인덱스를 찾는다.

2.서수 배열에서 인덱스에 해당하는 서수 인덱스 값을 찾는다.

3.EAT배열에서 서수 인덱스에 해당하는 함수 offset을 확인한다.

4.DLL Base 주소와 offset을 더해서 실제 함수 주소를 구한다.

 

 

 

 

 

끝마치며.....

사지방에서 작성하느라 많은 제한되는 점이 있었다.

직접 PE구조를 보면서 적지 못한게 아쉬운 점으로 남는다.

CTF 할때랑 다르게 Windows 쪽 Exploit 기법을 공부하다보니까,

리버싱이랑 많이 접목되는 것 같다.

그리고 다음 작성글은 실습환경이 구축이 되면 그걸 작성해볼려고 한다.

 

'SYSTEM HACKING > 기법' 카테고리의 다른 글

About Heap(1)  (0) 2021.12.25
Leak Stack Address  (0) 2021.05.02
Return to Csu  (0) 2020.04.26
[How2Heap] House of Force  (0) 2018.03.08
[How2Heap] House of Spirit  (0) 2018.02.01
    'SYSTEM HACKING/기법' 카테고리의 다른 글
    • About Heap(1)
    • Leak Stack Address
    • Return to Csu
    • [How2Heap] House of Force
    HO_9
    HO_9

    티스토리툴바