셸코드 제작 과정

  dll  ,   kernel32.dll:
 mov   eax,fs:[30h]
  test  eax,eax
  js  os_9x
os_nt:  
  mov  eax,[eax+0ch]
  mov  esi,[eax+1ch]
  lodsd  
  mov   eax,[eax+8]
  jmp  k_finished
os_9x:
  mov   eax,[eax+34h]
  mov  eax,[eax+7ch]
  mov  eax,[eax+3ch]
k_finished:
  sub  esp,200
  mov  edi,esp
  mov  [edi+8],eax  ;  kernel32    
      :
 
               
  kernel32    ,

                
                
                
                
kernel32 +0x3c e_lfanewc , PE
     PE  :
  windows PE    :

                
                
                
                
DOS MZ header
DOS stub
PE header
Section table
Section 1
Section 2
Section ...
Section n
PE 헤드는 다음과 같은 구조입니다.
IMAGE_NT_HEADERS STRUCT 
Signature dd ‘PE/0/0’
FileHeader IMAGE_FILE_HEADER <>
OptionalHeader IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS ENDS
  ,opt     
IMAGE_DATA_DIRECTORY,            。
IMAGE_OPTIONAL_HEADER32 STRUCT
....
LoaderFlags dd ?
NumberOfRvaAndSizes dd ?
DataDirectory IMAGE_DATA_DIRECTORY 16 dup(<>)
IMAGE_OPTIONAL_HEADER32 ENDS
image_data_directory     13            ,              。
 
                   
Member Info inside
0 Export symbols
1 Import symbols
2 Resources
3 Exception
4 Security
5 Base relocation
6 Debug
7 Copyright string
8 Unknown
9 Thread local storage (TLS)
10 Load configuration
11 Bound Import
12 Import Address Table
13 Delay Import
14 COM descriptor

 
데이터 directory 구조는 다음과 같습니다.
 
IMAGE_DATA_DIRECTORY STRUCT VirtualAddress dd ? isize dd ? IMAGE_DATA_DIRECTORY ENDS
 
여기에는 주소와 크기만 포함됩니다.
Export 테이블로 이동
 
모두 11명의 구성원이 있는데, 자주 사용하는 것은 아래 표에 열거되어 있다.
 
Field Name
Meaning
nName
모듈의 실제 이름입니다.파일 이름이 바뀔 수 있기 때문에 이 필드는 필수입니다.이 경우 PE 로더에 내부 이름이 사용됩니다.
nBase
기수, 서수를 더하면 함수 주소 수조의 인덱스 값이다.
NumberOfFunctions
모듈에서 인용한 함수/기호의 총수.
NumberOfNames
이름으로 인용된 함수/기호 수입니다.이 값은 모듈에서 인용한 함수/기호의 총수가 아니며, 위의 NumberOffunctions에서 제시합니다.이 필드는 0으로 모듈이 서수만 인용될 수 있음을 나타냅니다.만약 모듈이 함수/기호를 전혀 끌어내지 않는다면 데이터 디렉터리에서 끌어낸 표의 RVA는 0이다.
AddressOfFunctions
모듈에는 모든 함수/기호를 가리키는 RVAs 배열이 있는데, 이 영역은 이 RVAs 배열을 가리키는 RVA입니다.요컨대, 모듈의 모든 함수의 RVAs는 하나의 그룹에 저장되어 있으며, 이 필드는 이 그룹의 첫 번째 주소를 가리킨다.
AddressOfNames
이전 도메인과 유사하게 모든 함수 이름을 가리키는 RVAs 배열이 모듈에 있습니다. 이 배열은 이 RVAs 배열을 가리키는 RVA입니다.
AddressOfNameOrdinals
RVA - 위의 AddressOfNames 배열에 포함된 관련 함수의 시퀀스 수를 나타내는 16비트 배열입니다.
 
FindApi: ;API 함수 주소 하위 프로세스 push ebp push edi mov ebp, edi mov ebx, esp add ebx, 8 xor edx, edx mov eax, [ebp+8] add eax, 3ch 가져오기;PE 헤드에 대한 오프셋 값 elfanew mov eax,[eax] ;e 획득lfanew 값add eax, [ebp+8];PE header cmp dword ptr[eax], 4550h 가리키기;'PE'jne NotFound인지 판단하기;kernel32 기본 주소 오류 mov [ebp+0ch], eax;PE 파일 헤더 mov eax, [eax+78h]add eax, [ebp+8] mov [ebp+0ch], eax 저장하기;IMAGE 가리키기EXPORT_DIRECTORY mov eax,[eax+20h] add eax,[ebp+8] mov [ebp+4],eax ;함수 이름 포인터 배열의 포인터 값을 mov ecx, [ebp+0ch] mov ecx, [ecx+14h] FindLoop: push ecx mov eax, [eax] add eax, [ebp+8] mov ecx, [exex add esi, [ecx add esi, 8mov edi, eax mov ecx, [ebx+4] cld repex cmxb jne Find ext add eax, [ebp+8p+8p+8] mov esi, 8mov edi, 8mov ecx, eax mov ecx, [ebx+4x+4], [ebxx4x4x4x], [ebx4x4x], [ebeax, edx mov eax, [eax] add eax, [ebp+8] jmp Found Find Next: inc edx add dword ptr [ebp+4], 4 mov eax,[ebp+4] pop ecx loop FindLoop NotFound: xor eax,eax Found: pop edi pop ebp ret  

좋은 웹페이지 즐겨찾기