Linux 환경에서 ShellCode 제작 방법에 대한 포스팅 입니다.

 1. /usr/include/asm/unistd_[bit].h 에서 System Call 번호를 확인한다.  

 

< 그림 1. System Call 번호 확인 >

 

 

2. ShellCode 를 얻고자하는 어셈블리어를 작성한다. ( vi FileName.s 이용 )

 

< 그림 2. 어셈블리어 작성 >

 

3. 어셈블리어를 컴파일 한다.
    1) as -o [Object File Name] [Assembly File Path] 
    2) ld -o [Executable File Name] [Object File Name] 

4. 컴파일된 결과를 확인한다. 정상 작동 하는 경우 objdump -d 명령을 이용하여 OP Code를 추출한다.

 

< 그림 3. OP Code 추출 >

 

 

'0x003 Reversing > 04. Theory' 카테고리의 다른 글

[Tip] IDA Map 연동  (0) 2017.12.29
[Tip] IoT 펌웨어 분석 환경 구성  (0) 2017.12.29
[Windows] Hooking Immunity Debugger  (0) 2017.12.29
[Tip] Process 내 DLL 주소 찾기  (0) 2017.12.29

1. A 로 분석하고자 하는 프로그램을 로드 한 뒤 분석이 완료되길 기다린다.
2. File -> Produce file -> Create MAP File 메뉴를 이용하여 MAP 파일을 생성한다.
3. 아래 소스코드를 작성한 뒤 Immunity Debugger 에 사용한다.

 

 

import immlib
import re
import pefile

 

def usage(imm):
 imm.log("!map [mapfile]")
 imm.log(" ex) !map c:\\test.map")

 

def load_map(imm,filename):
 map_list = []
 f = open(filename, "r")
 contents = f.read()
 
 m=re.findall("\s+([\d\S]{4}):([\d\S]{8})\s+([^\d]\S+)",contents,re.M)
 if len(m) > 0:
  for line in m:
   map_list.append([int(line[0])-1, (int(line[1],16)), line[2]])
 return map_list

 

def main(args):
 imm = immlib.Debugger()
 imm.log("[*] Map v1.0 by hyunmini")


 if not args:
  usage(imm)
  return " [-] Not found map file"
 filename = args[0]
 map_list = load_map(imm,filename)
 
 module = imm.getDebuggedName()
 mod = imm.getModule(module)
 pe = pefile.PE(mod.getPath())


 for map in map_list:
  base = mod.getBaseAddress()
  section = pe.sections[map[0]].VirtualAddress
  func_offset = map[1]
  lable = map[2]
  lable_addr = base + section + func_offset
  imm.setLabel(lable_addr, lable)


 return "[+] Finish!! %d symbols" % len(map_list)

 

 

출처 : 윈도우 시스템 해킹 가이드 버그헌팅과 익스플로잇

 

  펌웨어는 특정 목적에 맞게 하드웨어를 동작시키기 위한 코드들로 구성되며, 일반적으로 부팅과 관련한 코드, 운영체제, 파일 시스템 등으로 구성된다. 이러한 펌웨어 코드는 비휘발성 메모리인 ROM, PROM, EPROM, EEPROM 에 일반적으로 존재하지만 최근에는 플래시 메모리로 대체되고 있다. 펌웨어는 덤프를 통해 수집하는 방법이 존재하며 제조사에서 공개하는 경우가 있으므로 해당 웹 사이트에서 펌웨어를 수집할 수 있다.
 

1. binwalk ( Firmware Analysis Tool )

  Open Source 펌웨어 분석 툴로 분석, 리버싱, 데이터 추출 등의 기능을 제공한다. Python 으로 작성되어 있으며 현재 리눅스 플랫폼만 지원한다.
https://github.com/devttys0/binwalk/blob/master/INSTALL.md

 


 

2. Firmware Modification Kit

  펌웨어를 수정할 수 있는 도구로 해당 시스템의 펌웨어 코드를 재컴파일 없이 펌웨어를 수정할 수 있도록 도와주며 GNU GPL Version 2 라이센스 기반의 오픈소스 형태로 제공되고 있다. 펌웨어 분석 및 수정에 활용 할 수 있는 다양한 도구 및 스크립트들을 하나로 구성하여 제공한다
 
  2.1) Firmware Modification Kit 환경 구성 
  
   2.1.1) 소스코드 다운로드 
    별도의 설치 과정은 없으며 아래 링크에서 소스코드를 다운 받아 압축 해제한다.   https://code.google.com/archive/p/firmware-mod-kit/
   
   2.1.2) 관련 라이브러리 설치
    Firmware Modification Kit 을 사용하기 위해서는 압축라이브러리( gzip / lzma )python magic 모듈이 필요하다우분투의 경우 아래 명령어로 간단하게 설치 할 수 있다.

 

  sudo apt-get install build-essential zlib1g-dev liblzma-dev python-magic

'0x003 Reversing > 04. Theory' 카테고리의 다른 글

[Linux] ShellCode 제작 방법  (0) 2017.12.29
[Tip] IDA Map 연동  (0) 2017.12.29
[Windows] Hooking Immunity Debugger  (0) 2017.12.29
[Tip] Process 내 DLL 주소 찾기  (0) 2017.12.29

Immunity Debugger는 13가지 후킹 기능을 지원하며 각 후킹은 독립 스크립트로 구현하거나 PyCommand 내부에서 구현할 수 있다.

 1) BpHook/LogBpHook : 브레이크 포인트가 발생될 때 호출 된다. BpHook는 대상 프로세스를 일시 정지 시키지만 LogBpHook는 그렇지 않다.
 2) AppExecptHook : 종류에 상관없이 예외가 발생하는 경우 호출된다.
 3) PostAnalysisHook : 디버가가 로드된 모듈에 대한 분석 작업이 끝났을 때 호출된다. 
 4) AccessViolationHook : 접근 위반이 발생할 때 마다 호출 된다.
 5) LoadDllHook/UnloadDllHok : DLL Load/Unload 시 호출 된다. 
 6) CreateThreadHook/ExitThreadHook : 스레스 생성 및 소멸 시 호출 된다.
 7) CreateProcessHook/ExitProcessHook : 프로세스 생성 및 소멸 시 호출 된다. 
 8) FastLogHook/STDCALLFastLogHook : 대상 프로세스의 특정 레지스터 값이나 메모리 주소를 로깅한다.

출처 : 파이썬 해킹 프로그래밍

'0x003 Reversing > 04. Theory' 카테고리의 다른 글

[Linux] ShellCode 제작 방법  (0) 2017.12.29
[Tip] IDA Map 연동  (0) 2017.12.29
[Tip] IoT 펌웨어 분석 환경 구성  (0) 2017.12.29
[Tip] Process 내 DLL 주소 찾기  (0) 2017.12.29

1) FS 레지스터를 이용하여 TEB 구조체에 접근한다. ( TEB는 현재 실행되고 있는 Thread에 대한 정보를 가지고 있다.  )
2) TEB + 0x30 에 위치한 PEB 구조체에 접근한다. ( PEB 구조체는 실행 중인 프로세스에 대한 정보를 담아두는 구조체이다. )
3) PEB 구조체 내에 0x00c 에 위치한 Ldr 멤버 현재 로드된 DLL 에 대한 정보를 링크드리스트 형태로 가지고 있다.

Windbg 명령어
1) db : Byte 단위로 메모리를 표시
2) dd : double Word 단위로 메모리 표시
3) dt : type을 표시( 구조체 등 )

'0x003 Reversing > 04. Theory' 카테고리의 다른 글

[Linux] ShellCode 제작 방법  (0) 2017.12.29
[Tip] IDA Map 연동  (0) 2017.12.29
[Tip] IoT 펌웨어 분석 환경 구성  (0) 2017.12.29
[Windows] Hooking Immunity Debugger  (0) 2017.12.29

+ Recent posts