728x90
반응형

단축키

h: hex와 decimal 변환

n: 변수명 변경

쉘 스크립트 > 코드 변경 > 함수 변경
> 함수 변경

c: Directly convert to code, sh(쉘 스크립트에 대해) 코드 변경(Data → Instruction)

p: 코드에 대해 함수로 변경(Instruction → Regular finction)

m: (pseudo code) enum 변경, (e.g. 숫자 → RESOURCEDISPLAYTYPE_FILE)

 

d: db dd dw 변환

db: define byte(바이트), 1byte의 메모리 할당

dd: define double-word, 4byte 메모리

dw: define word, 2byte 메모리

a: (db) 문자열로 변환

 

pseudo code의 좌측에 함수가 많이 없으면 패킹되었을 확률이 큼

메모리를 할당하면 쉘 코드(v47)를 올릴 확률이 큼

 

v47 = VirtualAlloc(IpAddress, 3 * v46, flAllocationType, 16 * v17

shellcode = (int (__stdcall *)(_DWORD, _DWORD))v47;

 

더미코드: ① 정의하고 쓰지 않는 것 ② 연산한 후 다른 값으로 덮어씌우는 것

__DWORD 포인터에 저장된 데이터를 

 

좌측 Function에 연두색 배경 표시되어 있다면, 클라우드에 미리 알려진 name으로 설정된 것

 

PE 헤더가 들어가는 부분(60, 120 - 0x3C, 0x78)

terminus project

윈도우 헤더 정보들을 정리해놓은 것

이것은 PE 헤더이므로 dos로 검색

 

 

 

728x90
728x90
728x90
반응형
목차
0. MIPS란?
1. 파일 구조 분석
2. 함수 정리
3. 명령어 정리
참고

0. MIPS란?

1) Million Instructions Per Second, 컴퓨터 분야에서 컴퓨터의 연산 속도를 나타내는 단위

2) Microprocessor without Interlocked Pipeline Stages, MIPS Technologies에서 개발한 RISC 기반의 명령어 집합 체계(컴퓨터 아키텍처)

* CISC: Complex Instruction Set Computer, 연산에 처리되는 복잡한 명령어들을 수백 개 이상 탑재하고 있는 프로세서

* RISC: Reduced Instruction Set Computer, 하나의 명령어 실행으로 간단한 프로세스들을 신속하게 수행

MIPS, ARM

마이크로 프로세서 세계에서 사용할 수 있는 두 가지 ISA (명령어 세트 아키텍처), 레지스터의 한 유형


1. 파일 구조 분석

32bit로 명령어 주소들이 4byte 단위로 떨어진다면 MIPS는 RISC 구조


2. 함수 정리

strcoll() 함수

아래 나열된 것과 같이 관계를 나타내는 값을 리턴함

예제 반환값
strcoll(const char *string1, const char *string2); string1이 string2보다 작음 0보다 작음
string1이 string2와 같음 0
string1이 string2보다 큼 0보다 큼

if ( !strcoll(*a2, "UDP") ) : ① a2가 참조하는 값과 UDP가 같으면 → ② if (!0) 이므로 참 → ③ 다음 if문 수행 (∵ if 0은 거짓)

값이 다르면 result로 a1 반환

atol() 함수

정수 문자로 구성한 문자열, 부호와 정수 문자들을 long 형식 값으로 변환하여 반환함


3. 명령어 정리

어셈블리어 예제 의미
NOP   아무 명령도 수행하지 않는 코드, 명령어 사이의 빈공간을 채워주는 역할
LA la $v0, 0x420000 Load Address, 레지스터 $v0에 0x420000가 가리키는 주소 load
ADDIU addiu A B C B + C의 값을 A에 삽입
BNEZ bnez R, L 레지스터 R이 0이 아니면 L로 점프
LW lw $s3 n($0) $0 주소에 n을 더해 주소가 0000000n인 곳의 데이터를 $s3에 삽입

 

$a1에 aCnc 값 삽입 (∵ $a1 = $v0 + (aCnc - 0x420000) = 0x420000 + (aCnc - 0x420000) = aCnc)

 

[MIPS Register]

$0 = Always 0

$at = The Assembler Temporary used by the assembler in expanding pseudo-ops.

$v0, $v1 = 리턴값 저장. 1 word 인 경우 $v0 만 사용. 초과할 경우 $v1 과 나눠서 저장

$a0-$a3 = 함수 인자값 저장. 초과할 경우 스택에 저장

$t0-$t9 = 임시 저장 레지스터

$s0 - $s7 = 저장 용 레지스터 – 함수 호출 중 불변

$k0, $k1 = 커널에서 사용하는 레지스터

$gp = 전역 포인터 레지스터

$sp = 스택 포인터

$fp = 함수 프레임 포인터 ($s8)

$ra = 서브루틴 호출 시 반환 주소 저장

 

[MIPS 주요 명령어]

addiu [addiu A B C] = [A <- B + C]

sw [sw A B] = [A ->B]

lw [lw A B] = [A <- B]

li(load immediate) [li A B] = [A <- B]

move [move A B] = [A <- B]

movn [movn A B C] = [if C != 0 then A <- B]

la [la A B] = [A <- B’s Addr]

lb [lb $a, (0)$s0] = $a 에 byte 단위로 데이터 로드

sb [sb $a, (100)$s0] = *($s0 + 100) 에 $a 저장

jal [jal A] - 다음 명령어의 주소를 $ra에 저장하고, A로 점프

bal [bal function] = function call = jalr

beq [beq A B L] = A와 B가 같으면 L로 점프

beqz [beqz R L] = R이 0이면 L로 점프

bne [bne A B L] = A와 B가 다르면 L로 점프

bnez [bnez R, L] = 레지스터 R이 0이 아니면 L로 점프

lui [lui A, 0x47] = A 레지스터 상위 2byte에 0x47 저장

0x90+var_73($fp) 와 같이 괄호가 있을 경우 $fp+(0x90+var_73) 와 같은 표현

slt [slt rd, rs, rt] = rd <= (rs < rt) ? 1 : 0

sll [sll $a, 1] = $a << 1

 

[MIPS 함수 호출 과정]

$ra 에 caller 의 return address 저장 (마지막 호출 함수의 경우 저장하지 않을 수 있음)

$a0 ~ $a3 에 인자값 저장 인자가 4개를 초과할 경우 초과한 만큼 스택에 저장

func(param1, param2, param3, param4) 일 경우 $a0 = param1, $a1 = param2, $a2 = param3, $a3 = param4 가 삽입

bal, jal, jalr 등 으로 함수 호출

return 값은 $v0 (4byte 초과시 $v1 에 나눠서 저장)

호출시 $ra 값 스택에 백업

$s0 ~ $s7도 필요한 경우 스택에 백업

$s8 레지스터와 $sp에 같은 값이 저장되어 있어서 $s8의 의미는 추가 파악이 필요

 

참고

[MIPS] MIPS 기본 내용 정리

IoT 환경을 위협하는 '리눅스 악성코드 Top 5'

 

 

728x90
728x90
728x90
반응형
목차
0. AutoHotkey1 파일 실행
1. 오토핫키 이해
2. OllyDbg 디버깅
3. 오토핫키 스크립트 사용법
4. 오토핫키 취약점

[Review] (6주차) 실습

2022.08.24 - [Security & Analysis/IDA Pro] - [IDA Pro] chap.06 악성코드 정적분석 툴 사용법(Ransomware, reversing.kr)

 

[IDA Pro] chap.06 악성코드 정적분석 툴 사용법(Ransomware, reversing.kr)

목차 0. Ransomware 파일 내부 1) file 정보 2) readme.txt 파일 3) run.exe 파일 1. run.exe 파일 실행 1) Exeinfo.exe 설치 2) HxD 설치 3) UPX 설치 4) OllyDbg 설치 5) WOW64 설치 2. IDA run.exe 파일 분석 3..

sarahee.tistory.com


0. AutoHotkey1 파일 실행

readme.txt 파일 확인

Decrypt, EXE Key는 md5 값이며, 해당 md5를 복호화하여 인증키 획득 가능

문제에서 요구하는 key 값: decrypt, exe

AutoHotKey는 해당 언어로 된 소스코드를 exe로 컴파일할 때 비밀번호 지정(무분별한 디컴파일 방지를 위해)

→ DecryptKey: 디컴파일 시 필요한 비밀번호, 바이너리가 실행될 때 메모리 상에서 평문 형태로 존재

→ EXE's Key: 디컴파일된 소스코드 내 사용자에게 요구하는 값, 소스코드에서 확인 가능


1. 오토핫키(AutoHotkey) 이해

  • 윈도우 응용 프로그램 및 매크로를 만드는 오픈 소스 자유 소프트웨어이자 스크립트 언어
  • 사용자가 반복작업을 자동으로 할 수 있도록 도와줌, 간략하게 매크로 프로그램이라고 이해

참고. 접근성

// C Language
#include <stdio.h>
int main(void) {
	print("Hello world!");
    return 0;
}

// AutoHotKey
Msgbox, Hello world!

다운로드

https://www.autohotkey.com/

스크립트 확장자는 .ahk이고, 설치하면 Compiler 폴더의 Ahk2Exe를 사용하여 ahk를 exe로 컴파일 가능

→ AutoHotKey 프로그램에 비밀번호를 설정한 후, 입력 값 일치하면 프로그램을 실행할 수 있도록 하는 기능

따라서 ahk.exe 파일에 입력해야 하는 비밀번호가 decript's key가 됨

  • Exe2Aut.exe 디컴파일러
  • ank의 password: decript's key

ahk.exe 파일 확인

입력 창에 임의의 문자를 입력한 후, OK 버튼을 누르면 프로그램이 종료

패킹된 파일을 그대로 디버거로 로드하면, 함수나 문자열 등 제대로 확인하기 어려움

파일을 제대로 분석하기 위해서는, 디버깅 상태에서 다음과 같은 명령어를 확인해야 함

  • F2: 브레이크 포인트 설정
  • F7: 디버깅 중 프로그램을 한 줄 실행시킴
  • F8: 디버깅 중 프로그램을 한 줄 실행시킴(call 명령어가 있을 경우에는 해당 함수로 들어가지 않음)

exeinfope.exe로 파일 구조 파악

UPX(Ultimate Packer for eXecutables): 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램

exe 파일이 압축되어 있어서 내부 구조 확인하기 어려움

(패킹: -o, 언패킹: -d 옵션)

다시 exe 파일 실행 시 출력 화면이 다음과 같이 변경

exe 파일 손상 등의 사유로 열 수 없음

파일 검증하는 CRC 체크 부분에서, 위와 같은 EXE corrupted 문구 출력

컴파일 후 변조가 되면 해당 문자열 출력

HS_EXEArc_Read::Open 함수에서 체크하여, 이후 어떤 분기문으로 이동할 지 스크립트를 실행시킴

→ UPX 언패킹한 바이너리 분석 시 CRC 체크 영역에 걸려서 에러

오토핫키 프로그램은 컴파일 시 자동으로 UPX 패커를 적용시키기 때문에 언패킹을 한 이후 분석을 하면 DecryptKey를 찾을 수 없음(디컴파일 시 필요한 비밀번호이므로)

+ 알고리즘을 숨기고 복원하는 과정에서 힌트를 얻고 디컴파일을 수행할 수 있겠지만, 해당 프로그램 특성 상 언패킹 시 분기문에서 탈락하도록 설정했으므로 의미 없음

하단의 >AUTOHOTKEY SCRIPT< , >AHK WITH ICON<

특정 함수의 반환값을 조건으로 "EXE corrupted" 메시지 박스를 띄우고 종료하는 분기

">AUTOHOTKEY  SCRIPT<" 문자열을 사용하는 함수를 호출하는 분기


2. OllyDbg 디버깅

OllyDbg: 바이너리 코드 분석을 위한 x86 디버거(소스 코드가 없을 때 주로 사용)

- 레지스터 추적, 함수/API 호출, 문자열 인식, 오브젝트 파일과 라이브러리 내 루틴 위치 검색

 

바로 Debug Run할 경우, (or F9 단축키)

Options > Debugging options (or) Alt + O > Events 버튼 클릭하여 Make first pause at: Entry point of main module 체크

* 제어가 운영 체제에서 컴퓨터 프로그램으로 이동하는 것 → 패킹된 파일의 실제 프로그램 시작 부분

OllyDbg 활용 OEP 확인

OEP란? unpacking에서 가장 중요한 부분(Original Entry Point)

packing되기 전으로 돌아간 곳, 덤프를 통해 packing 해제된 파일을 만듦

UPX로 압축하면 PUSHAD와 POPAD 어셈블리어는 필수적으로 생성

PUSHAD 실행 이후 맨 위의 스택 주소를 덤프하여 BYTE H/W BreakPoint를 지정하고 실행해서 POPAD 다음에서 멈추도록 함

JMP 명령어를 통해 OEP로 이동

* 스택에서 레지스터들이 POP이 되는 순간을 캐치하면 OEP로 진입할 수 있는 힌트를 찾아낼 수 있을 것

Entry point breakpoint

PUSHAD로 시작하는 첫번째 instruction 조회

PUSHAD 명령어: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 모든 레지스터를 stack에 PUSH하는 역할

일반적인 packer는 특정 위치의 레지스터들의 백업을 만들어 놓기 위해 처음에 PUSH 명령을 이용하여 저장

(∵ 패킹된 파일이 루프를 돌면서 연산을 하게 됨, 기존 레지스터가 수정될 수 있기 때문에 저장, 루틴이 모두 끝나고 정상 코드를 실행시킬 때 이 레지스터들을 돌려 받기 위함)

→ 파일 메인 프로그램이 실행되기 전에 POP instruction으로 레지스터를 복귀

(참고) System breakpoint 설정했을 경우

  • 2사분면(Code Window) 왼쪽: 주소 창(명령어가 실행되는 주소)
  • 2사분면(Code Window) 가운데: 기계어(OP 코드 창)
  • 2사분면(Code Window) 오른쪽: 어셈블리어(디스어셈블리 창)
  • 1사분면(Register Window): 레지스터 값 표시
  • 3사분면(Dump Window): 메모리 덤프 창 - 특정 시점에 작업 중이던 메모리 상태(주소, Hex dump, hex to ASCII 해석 내용) 기록
  • 4사분면(Stack Window): 스택 주소 값, comment 순으로 출력

PUSHAD 위아래 추가 설명

POPAD 명령어 실행 전 루프문들이, 압축된 코드를 해제하는 과정

Dump Window의 Ctrl+G > (Enter expression to follow in Dump:) ESP 입력 후 확인

* 스택 프레임의 끝지점 주소가 저장되는 최상단 구간(ESP)

Hex dump 부분 우클릭 > Breakpoint > Hardware, on access > Byte

다시 Run하면 하드웨어 브레이트 특성 상 Breakpoint 설정 명령어 이후 제어가 멈추므로 0x00471BCC에서 Paused됨

아래로 스크롤하다 보면 거의 마지막 코드에 POPAD

JMP 명령어 뒤에 오는 주소가 OEP임(ahk.00442B4F)

해당 주소로 점프(Ctrl+G)하여 조회

Ctrl+A: 코드 분석(다시 읽기)

Ctrl+F: POPAD 찾기

Compressed code?
Quick statistical test of module 'ahk' reports that its code section is either compressed, encrypted, or contains large amount of embedded data. Results of code analysis can be very unreliable or simply wrong. Do you want to continue analysis?

 

AutoHotKey의 패킹된 바이너리를 실행해서 OEP까지 간 다음 CRC 체크를 통해 에러가 발생했을 때 출력되는 문자열 영역을 기준으로,

바로 위에 있는 CRC 체크 함수 내부를 분석

hash 처리된 값 하나가 EBX에 추가됨

 

publicKeyToken="6595b64144ccf1df"

 

Exe's key = 54593f6b9413fc4ff2b4dec2da337806

decrypt key = 220226394582d7117410e3c021748c2a

 

MD5로 decrypt 수행

https://www.md5online.org/md5-decrypt.html

 

→ pawn isolated


3. 오토핫키 스크립트 사용법

오토핫키 스크립트는 오토핫키 소스코드가 보관되어 있는 곳

프로그램이 실행될 때 스크립트를 열어서 소스코드를 확인하면서 돌아가는 것

 

바탕화면 우클릭하여 새로 만들기(W) > AutoHotKey Script

새 script 생성(이름 바꾸기)

우클릭 > 더 많은 옵션 표시 or Shift+F10 단축키 클릭하여 Edit Script

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

본래 내용을 지우고 다음과 같이, F1버튼을 눌렀을 때 hello라는 메시지 창이 나오도록 코드 작성

이후 저장하고 창 닫기

  • .ahk 파일 우클릭하여 Compile Script 하면 .exe 파일이 생성
  • .exe 파일을 관리자 권한으로 실행하여 하단 바에 AutoHotKey icon 생성

F1 단축키 클릭 시 다음과 같은 화면 출력


4. 오토핫키 취약점

CVE-2020-18174 취약점

AutoHotkey 1.1.32.00의 setup.exe에 있는 프로세스 주입 취약점으로 인해 공격자가 권한을 상승시킬 수 있음

reversing.kr에서 다운로드 받은 파일 버전: 1.0.48.5

 

 

728x90
728x90
728x90
반응형
목차
0. Ransomware 파일 내부
  1) file 정보

  2) readme.txt 파일
  3) run.exe 파일
1. run.exe 파일 실행
  1) Exeinfo.exe 설치
  2) HxD 설치
  3) UPX 설치
  4) OllyDbg 설치
  5) WOW64 설치
2. IDA run.exe 파일 분석
3. OllyDbg run.exe 파일 분석
4. Key값 구하기
5. 소스코드 정리 및 연산 수행
6. 최종 실행 및 Flag 확인

[Review] (5주차) 실습

2022.08.06 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

목차 1. Easy ELF 실습 - 실습을 위한 사전 단계(Linux 파일 실행) 2. 분기문 분석 3. byte 및 배열 정리 4. 소스코드 작성(어셈블리어 기반) [Review] (4주차) 이론 - 총정리 2022.07.19 - [Security & Analysis/..

sarahee.tistory.com


0. Ransomware 파일 내부

랜섬웨어 암호화 file 및 txt, exe 파일

zip 파일의 압축을 풀면 다음과 같이 file 및 txt, exe 총 3개의 파일 생성

file에 파일 확장자가 없기 때문에 바이너리 형식으로 암호화되었다고 판단

따라서 16진 편집기인 HxD 사용 예정

1) file 정보

2) readme.txt 파일

file 확장자가 exe

ui 파일을 .py로 변경(Pyutic)

3) run.exe 파일


1. run.exe 파일 실행

IAT: Import Address Table, 프로그램이 어떤 라이브러리에서 어떤 함수를 쓰는지 기술한 테이블

프로그램이 특정 API를 실행하고자 할 때 IAT를 불러옴

압축되어 있어서 확인 불가

해당 파일이 압축되어 있어서, 내부 정보 확인이 불가

1) Exeinfo PE 파일 다운로드하여 정보 확인

https://exeinfo-pe.kr.uptodown.com/windows

 

Exeinfo PE (Windows)

Exeinfo PE을 위한 Windows을 무료로 다운로드하세요. .exe 파일 확인하기. Exeinfo PE는 여러분이 .exe 파일들을 확인하여 그 속성을 살펴볼 수 있는 프로그램입니다. 또한, 해당 파일의 이름을 변경하고

exeinfo-pe.kr.uptodown.com

파일이 UPX로 패킹되어 있음

(언패킹된 프로그램을 출력 시 컴파일된 언어 등 조회 가능)

2) HxD 설치

Window 용 16진 편집기, 디스크/메모리 편집기, 프로세스 실행에 사용되는 메모리를 표시하고 편집할 수 있음

https://mh-nexus.de/en/downloads.php?product=HxD20 

3) UPX 설치

하단 Unpack info

Big sec. 2 [ UPX1 ] , unpack "upx.exe -d"  from  http://upx.github.io or any UPX/Generic unpacker

해당 사이트에 접속하여 설치 진행

UPX란?

the Ultimate Packer for eXecutables, 오픈 소스 실행 파일 압축 프로그램

Download latest release > upx-3.96-win64.zip
다운로드 받은 upx.exe 파일을 unpacking하고자 하는 exe 파일에 위치

upx.exe -d run.exe

Not packed, 내부 정보 확인 가능

4) OllyDbg 설치

https://www.ollydbg.de/download.htm

5) WOW64 설치

운영체제의 하위 시스템, 32비트 윈도우와 64비트 윈도우의 차이 보완

모든 64비트 버전의 마이크로소프트 윈도우에서 32비트 응용 프로그램들이 돌아가도록 도와줌

https://ko.dll-files.com/wow64.dll.html

zip 파일 압축 해제 후, regsvr32 wow64.dll


2. IDA run.exe 파일 분석

cmd 명령어에서 확인한 Key 문자열 검색하여 알고리즘 확인

Key의 입력값이 byte_44D370에 저장

call [접근할 함수 주소]

file 문자열 확인

StartAddress Functions 내부 file open

함수 시작 부분에 코드 반복 ← 파일 크기 키우고, 분석에 어려움을 주기 위함

 

rb는 file을 읽는 형식

read binary, 즉 바이너리 형식으로 파일을 읽겠다는 의미

 

좌측 printf: '파일을 찾을수 없다!' 문자열 출력 구문

 

하단 Stream

* Stream: 컴퓨터 처리 환경에서, 시간이 지남에 따라 사용할 수 있게 되는 일련의 데이터 요소

fseek: fopen으로 호출된 파일의 위치 변경

ftell: 스트림 위치 지정자의 현재 위치(파일 포인터)

feof: stream(FILE)의 파일 끝 플래그가 설정되었는지 여부 표시, 파일의 끝 위치 확인

fgetc: 파일에서 글자를 하나씩 읽는 함수

→ feof를 이용해 파일의 끝에 도달할 때까지 fgetc 함수를 통해 1byte씩 file 파일로부터 읽어들임

wb, binary 형식으로 file을 쓰겠다는 의미

  • 좌측 하단 printf: '파일을 복구했다! ~' 문자열 출력
  • 우측에 핵심 부분으로 복호화를 수행하는 loop 존재

알고리즘 loop

1) xor edx, edx - ebp+Stream 등.. 의미 없음(모두 0이 되므로, 초기화하는 과정)

2) div [ebp+var_C] - 입력한 key가 DIV 연산에 의해 끝 byte에 도달했을 때, 처음 byte로 돌아감

3) xor ecx, edx - input으로 입력한 key 중 한 byte와 XOR 연산 수행(ecx: 입력값(반복 카운터), edx: key값)

4) xor edx, 0FFh - 위의 결과와 0xFF XOR 연산 수행

 

XOR 연산의 성질에 의해, Key를 찾기 위해 file 파일과 0xFF를 XOR

Original File을 바이트 단위로 XOR

Original File은? readme.exe 파일의 hint에 의해 복호화된 파일은 exe 파일(PE구조)이라는 것을 판단

 


3. OllyDbg run.exe 파일 분석

run.exe file open


4. Key값 구하기

file이 exe 포맷이므로, header 구조는 다른 exe 파일과 동일할 것

upx.exe, run.exe

00000000 ~ 00000070까지 대부분 동일한 헤더값을 가지며,(00000030의 F0, 80 차이)

키 값을 모르기 때문에 0x20 크기 복호화

  • 복호화 되어야 할 값:
  • 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00
B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 F0 00 00 00
0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68
69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F
74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20
6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00

 

file

  • 암호화된 값: 
  • DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B
34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
9E 86 9C 97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 9C
97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 6C 97 9A 8C
82 8C 20 85 8C 3B 9A 53 A7 24 96 D6 41 AD C7 F2
E2 FF AF E3 EC E9 FB E5 FB E1 AC F0 FB E5 E2 E0
E7 BE E4 F9 B7 E8 F9 E2 B3 F3 E5 AC CB DC CD A6
F1 F8 FE E9 A2 9E 97 81 A8 8F 93 9E 86 9C 97 9A

5. 소스 코드 정리 및 연산 수행

해당 파일이 최종 구현된 소스코드

key = input('Key : ').encode()

f = open('./ransomware/file', 'rb')
enc_content = f.read()
f.close()

dec_content = []
for i in range(len(enc_content)):
    dec_content.append(enc_content[i] ^ key[i % len(key)] ^ 0xFF)
dec_content = bytes(dec_content)

f = open('file', 'wb')
f.write(dec_content)
f.close()

 

de_file[i] = en_file[i] ^ key[i] ^ 0xFF → key[i] = en_file[i] ^ de_file[i] ^ 0xFF

원본 데이터가 반복이라면, key 값만 달라지기 때문에 key의 길이만큼 동일 데이터가 반복될 것

 

# sol1

# 20 bytes
# 암호화된 값 : DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93
# 복호화 되어야 할 값: 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00

enc_content = [0xDE, 0xC0, 0x1B, 0x8C, 0x8C, 0x93, 0x9E, 0x86, 0x98, 0x97, 0x9A, 0x8C, 0x73, 0x6C, 0x9A, 0x8B, 0x34, 0x8F, 0x93, 0x9E, 0x86, 0x9C, 0x97, 0x9A, 0xCC, 0x8C, 0x93, 0x9A, 0x8B, 0x8C, 0x8F, 0x93]
dec_content = [0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

key = ''
for i in range(len(enc_content)):
    key += chr(dec_content[i] ^ enc_content[i] ^ 0xFF)
print(key)

# sol2

enc_content = "DE C0 1B 8C 8C 93 9E 86 98 97 9A 8C 73 6C 9A 8B 34 8F 93 9E 86 9C 97 9A CC 8C 93 9A 8B 8C 8F 93".split(' ')
dec_content = "4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00".split(' ')

for i in range(len(enc_content)):
    enc_content[i] = int(enc_content[i], 16)
    dec_content[i] = int(dec_content[i], 16)
    enc_content[i] = enc_content[i] ^ 0xFF
    enc_content[i] = enc_content[i] ^ dec_content[i]
    print(chr(enc_content[i]), end="")

결과값: letsplaychess 반복


6. 최종 실행 및 Flag 확인

기존의 file을 확장자 변경(exe) 후 실행하면, 다음과 같이 실행 불가

run.exe 파일 실행 후 결과값(Key : letplaychess) 입력

 

 

728x90
728x90
728x90
반응형
목차
1. Easy ELF 실습
  - 실습을 위한 사전 단계(Linux 파일 실행)
2. 분기문 분석
3. byte 및 배열 정리
4. 소스코드 작성(어셈블리어 기반)

[Review] (4주차) 이론 - 총정리

2022.07.19 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pse

sarahee.tistory.com


1. Easy ELF 실습

ELF 파일은 리눅스의 실행파일이므로, 실행시킨 후 랜덤 문자를 입력

Wrong 출력

파일 확장자를 모든 파일(All Files (*))로 변경

2. 분기문 분석

실행 후 View > Open subviews > Strings (or Shift + F12)

문자열 검색

리눅스 실행 시 조회된 문자열(Reversing.Kr Easy ELF, Wrong) 및 정답 출력 예상(Correct) 조회

Wrong 해당 그래프 모드 확인

Wrong graph

cmp를 통해 분기문 이동

jump if not zero(not equal) → eax가 1이라면(빨간색 화살표), Correct 연결

레지스터나 메모리 값을 변경하지 않고, 플래그 레지스터에만 영향을 줌

* flag register: 상태 레지스터

Correct graph

분기문 지나기 전 call 링크 두개

sub_8048434

sub_8048451

eax가 1이 되기 위해서는, 모든 분기문에서 조건 점프(초록색 화살표 이동)하여, 우측 하단으로 차례 이동

3. byte 및 배열 정리

첫 번째 조건문

byte_804A021의 값과 31h 비교

 

두 번째 조건문

byte_804A020을 eax에 저장하여,

첫 번째 문자(eax 내)와 0x34 XOR 연산

 

세 번째 문자(byte_804A022)와 0x32 XOR 연산

네 번째 문자(byte_804A023)와 0x0FFFFFF88 XOR 연산

다섯 번째 문자(byte_804A024)와 0x58 값이 같은지 비교

 

네 번째 조건문

테스트

 

네 번째 조건문

세번째 문자(byte_804A022)와 0x7C 비교

 

다섯 번째 조건문

첫번째 문자(byte_804A020)와 0x78 비교

 

여섯 번째 조건문

네번째 문자(byte_804A023)와 0x0DD 비교

No. CODE XREF 어셈블리어 10진수 to 문자(ASCII) 순서
1 sub_804851B+2A↓p cmp     al, 31h 0x31 = 49, chr(49) = 1 byte_804A021
2 sub_8048451+C↑j
loc_8048469
xor     eax, 34h
xor     eax, 32h
xor     eax, 0FFFFFF88h
cmp     al, 58h
0x34 = 52, chr(52) = 4
0x32 = 50, chr(50) = 2
0x88 = 136, chr(136) = (enter)
0x58 = 88, chr(88) = X
byte_804A020
byte_804A022
byte_804A023
byte_804A024
3 sub_8048451+4E↑j
loc_80484A8
test     al, al    
4 sub_8048451+60↑j
loc_80484BA
cmp     al, 7Ch 0x7C = 124, chr(124) = | byte_804A022
5 sub_8048451+72↑j
loc_80484CC
cmp     al, 78h 0x78 = 120, chr(120) = x byte_804A020
6 sub_8048451+84↑j
loc_80484DE
cmp     al, 0DDh 0xDD = 221, chr(221) = Ý byte_804A023

 

정리해보면, input 문자열은 다음과 같이 구성 (^: XOR)

input[0] ^ 34h = 78h

input[1] = 31h

input[2] ^ 32h = 7Ch

input[3] ^ 88h = DDh (byte이므로 88 앞의 FFFFFF는 무시)

input[4] = 58h

input[5]는 test(세 번째 조건문)

4. 소스코드 작성(어셈블리어 기반)

// string
ans = ""

ans += chr(0x34 ^ 0x78)
ans += chr(0x31)
ans += chr(0x32 ^ 0x7C)
ans += chr(0x88 ^ 0xDD)
ans += chr(0x58)

print(ans)

 

출력: L1NUX

Correct! 정답 출력

 

 

728x90
728x90
728x90
반응형
개요
* Easy_KeygenMe.exe 파일 실습
1. 레지스터 활용 분석
- 메모리 주소 및 스택 프레임의 이해
- ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리
2. 어셈블리 명령어 이해 및 알고리즘 분석
- Pseudo code 기반 소스코드 작성

목차
0. 파일 버전 확인(32bit, 64bit)
1. 정의된 데이터(db)
2. 어셈블리어: CMP, LEA, TEST, XOR, MOV, MOVZX, MOVSX
3. 메모리의 구조
   1) 코드 영역
   2) 데이터 영역
   3) 힙 영역
   4) 스택 영역 - 레지스터: ESP, EBP, EIP, ECX, EAX

4. IDA 메모리 주소 표시 차이

[Review] (3주차) 실습

2022.07.04 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe) (1)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com


0. 파일 버전 확인(32bit,  64bit)

실행파일 32bit, 64bit 버전 확인(e.g. exe, dll, ocx)

ExeProperties 프로그램: 윈도우 탐색기에 플러그인, 실행파일이나 프로그램 내부적으로 사용하는 라이브러리(dll, ocx 등)가 사용하는 비트 확인

Download ExeProperties

 

Download ExeProperties

<!--   ExtraBit Software Ltd. Products | Contact --> ExtraBit Software Home ExeProperties Download Download ExeProperties Download the ExeProperties installer for Windows 11/10/8/7 Download ExeProperties v1.4 To install ExeProperties on your system, run t

www.extrabit.com

설치 이후, 해당 파일 우클릭 > 속성(R) > Exe/Dll Info 탭 추가되어, Additional Exe/Dll Properties 확인 가능

Type: x86 (32-bit) or x64 (64-bit)

기본 속성(Alt+Enter)
Download ExeProperties v1.4
32-bit 확인


1. 정의된 데이터(db)

# define 식별자 문자열

  • 식별자: 매개변수, 전달인자, ...
  • 문자열: 치환텍스트

2. 어셈블리어: CMP, LEA, TEST, XOR, MOV, MOVZX, MOVSX

CMP

cmp [esp+68h+var_63], 61h: esp+68h+var_63의 값이 61h 위치에 있는 값과 같은지 비교(값을 빼서 비교)

LEA

lea edi, [esp+68h+var_63]: esp+68h+var_63에 저장된 주소를 esp에 저장

TEST

: 인수1과 인수2 내용을 AND 연산하여 결과가 0이면 ZF = 1로 설정(보통 NULL check할 때 사용)

(두 operand가 0이 아닌 경우를 제외하고는 값을 판별하기 어려움 → eax, eax와 같은 형태로 사용하여 0인지 아닌지 확인)

Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음

XOR

두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값 → 초기화

MOV

데이터 복사 명령어

MOVZX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding

(목적지에 32bit register → 소스에 16bit register)

MOVSX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움

(목적지에 32bit register → 소스에 16bit register)


3.  메모리의 구조

1) 코드(code) 영역

const int constval = 30;  // 상수

int function() {  // 함수
    return 20;
}

실행할 프로그램의 코드가 저장되는 영역 (= 텍스트 영역)

2) 데이터(data) 영역

int uniintial;  // 초기화되지 않은 전역변수
int initial = 30;  // 초기화된 전역변수
static int staticval = 70;  // 정적변수

프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역

프로그램 시작 시 할당, 프로그램 종료 시 소멸

3) 힙(heap) 영역

int main(int argc, const char * argv[]) {
    char *arr = malloc(sizeof(char) * 10);  // 동적 할당 변수
    return 0;
}

사용자가 직접 관리하는 메모리 영역

사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨

메모리의 낮은 주소에서 높은 주소로의 방향으로 할당

4) 스택(stack) 영역

int main(int argc, const char * argv[]) {
    int localval1 = 30;  // 지역변수 1
    int localval2;  // 지역변수 2
    return 0;
}

지역 변수와 매개변수가 저장되는 영역(함수의 호출과 관련)

함수의 호출과 함께 할당, 함수의 호출이 완료되면 소멸

스택 영역에 저장되는 함수의 호출 정보: 스택 프레임(stack frame)

 

스택에 할당된 메모리 블록, 호출된 함수에 지정

함수가 호출되면,

1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.

2) 함수의 작업을 위한 임시 저장소가 필요하다.

* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)

* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가

전역변수가 저장되는 곳이 스택이라는  메모리 공간

먼저 선언된 변수일수록  높은 주소값을 할당 받음

→ ESP, EBP는 이러한 스택 공간의 주소값을 저장하기 위해 설계된 레지스터


레지스터: ESP, EBP, EIP, ECX, EAX

* E: Extended(16bit → 32bit system), 64bit에서는 R로 표현

ESP(Stack Pointer)

: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용

  • 현재 스택의 최상단 주소값(가장 작은값) 저장(∵ 스택의 주소는 높은 주소에서 낮은 주소로 할당)
  • 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦

EBP(Base Pointer)  (= Frame Pointer)

: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)

  • 현재 스택 프레임의 베이스 주소(스택의 가장 윗 부분)
  • 스택 프레임(함수나 지역변수의 경계를 구분짓기 위한 하나의 블록으로 묶임)의 base 주소
  • 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터
  • 고정적, 코드 유지에 용이(스택프레임 생성시)

EIP(instruction pointer)

: 다음에 실행할 명령어 위치를 담는 레지스터

ECX(Extended Counter Register)

: 주로 반복 명령어 사용시 반복 카운터로 사용

EAX(Extended Accum ulator Register)

: 산술(덧셈, 곱셈, 나눗셈 등) 논리 연산을 수행할 때 사용, 함수의 반환값이 이 레지스터에 저장


4. IDA 메모리 주소 표시 차이

var_(숫자): 함수의 지역변수, EBP보다 더 낮은 메모리 주소에 위치하므로 음수 값을 가짐

스택 메모리 구조 상 지정된 주소는 초기 스택 포인터보다 낮은 주소에 있어야 하므로, 스택 포인터가 양수 값을 가지면 에러

디버거 메모리 주소 형태 비고
Ollydbg ESP + n 일반적인 형태
IDA Pro ESP + 현재 스택 포인터 + var_? 자동으로 스택의 사용을 조사해서 지역 변수를 찾아내는데 용이하도록 설정

IDA 디스어셈블러 화면 시작 부분의 var_? 형태로 특정 값이 설정되어 있음

함수 시작 시 EBP 주소를 기준으로 스택 상에 변수가 위치하는 오프셋 값

단축키

1) (지역 변수 선택 후) + x

해당 지역 변수가 또 다른 어디에서 참조되었는지 확인 가능

2) (지역 변수 선택 후) + Enter

"Stack of ..." 창 조회, 해당 함수에서 추측된 스택 프레임 보여줌


[Next] (5주차) 실습

2022.08.06 - [Security & Analysis/IDA Pro] - [IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

 

[IDA Pro] 악성코드 정적분석 툴 사용법&이론 - week.05(Easy ELF)

목차 1. Easy ELF 실습 - 실습을 위한 사전 단계(Linux 파일 실행) 2. 분기문 분석 3. byte 및 배열 정리 4. 소스코드 작성(어셈블리어 기반) [Review] (4주차) 이론 - 총정리 2022.07.19 - [Security & Analysis/..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근

목차
0. Easy KeygenMe 실습
1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX
2. 알고리즘 분석
3. XOR(⊕) 연산의 결합법칙
4. 소스코드 작성(pseudo code 기반)

[Review] (3주차) 실습

2022.07.04 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe) (2)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com


0. Easy KeygenMe 실습

Intro

Find the Name when the Serial is 5B134977135E7D13

Name을 사용해서 시리얼 값 생성, 역으로 시리얼 값을 통해 해당 Name을 찾아내는 문제

초기 디스어셈블리 창
debug Running page
Input Name, Input Serial

시리얼 생성 알고리즘과 관련된 문제 풀이

1) 어셈블리어로 전체적인 구조 파악

2) Hex-rays로 세부 알고리즘 파악

rep stosd: 저장소 문자열 명령

stosb: AL로부터 byte를 읽어 들임, stosw: AX로부터 word를 읽어 들임 - 정수값을 메모리에 복사


1. 어셈블리어: MOV, CMP, XOR, MOVZX, MOVSX

MOV

데이터 복사 명령어

0x10: [esp+140h+var_130]

0x20: [esp+140h+var_12F]

0x30: [esp+140h+var_12E]

Byte 단위로 각각 스택에 넣어줌, 사용자가 입력한 문자열을 첫번째 글자부터 순서대로 Byte 단위로 레지스터에 넣음

CMP

esi가 3 이상이면 0으로 초기화

XOR

두 입력 신호가 서로 같으면 0, 다르면 1, 동일한 두 값초기화

MOVZX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 0 padding

(목적지에 32bit register 소스에 16bit register) 

MOVSX

소스의 내용을 목적지로 복사, 목적지의 나머지 부분을 소스의 맨 처음 bit로 채움

(목적지에 32bit register → 소스에 16bit register)

loc_40107E: pseudocode


2. 알고리즘 분석

1) v3이 v8의 strlen이 클 때 까지 반복하고, i가 3 이상이면 0으로 초기화

2) sprintf를 통해 Buffer에 생성된 serial 저장

3) "%s%02X"를 통해 기존 Buffer 내용과 v8 포인터 입력값을 한글자씩 가져옴

4) xor 연산을 한 값을 sprintf 함수를 통해 serial이 저장되는 Buffer에 저장

5) serial을 계산하여 scanf로 입력받은 후, strcmp 함수로 동일한지 비교

- if 0일 때 거짓, 0이 아닐 때 참으로 동작하므로, strcmp 내 0일 경우(문자열이 같을 경우) Correct 출력

 

v6에는 16 16 = 0x10

v7[i - 1]가 될 수 있는 값은, v7[0], v7[1], v7[2]의 반복

qmemcpy: sizeof(v7)만큼 " 0" 영역의 값을 v7로 복사

첫번째 인자(v7): 복사받을 메모리를 가리킴

두번째 인자(" 0"): 복사할 메모리를 가리킴

세번째 인자(sizeof(v7)): 복사할 데이터(값)의 길이(바이트 단위)

 

16진수이므로 두자리씩 끊어서 총 8자리


3. XOR(⊕) 연산의 결합법칙

^: XOR 연산자

p q p ⊕ q (p ⊕ q) ⊕ q
T T F T
T F T T
F T T F
F F F F

(p ⊕ q) ⊕ q ≡ p ⊕ (q ⊕ q) ≡ p ⊕ F ≡ p

 

0x5b^0x10

0x13^0x20

0x49^0x30

0x77^0x10

0x13^0x20

0x5E^0x30

0x7D^0x10

0x13^0x20


4. 소스코드 작성(pseudo code 기반)

# sol1

serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []

i_xor = 0
for i_ser in range(len(serial)):
    if i_xor >= 3:
        i_xor = 0
    ans.append(serial[i_ser]^xor[i_xor])
    i_xor += 1
    print(chr(ans[i_ser]), end='')

# sol2

serial = [0x5B, 0x13, 0x49, 0x77, 0x13, 0x5E, 0x7D, 0x13]
xor = [0x10, 0x20, 0x30]
ans = []

for i in range(len(serial)):
    ans.append(serial[i]^xor[i%3])
    print(chr(ans[i]), end='')

출력: K3yg3nm3

75 51 121 103 51 110 109 51

Name: K3yg3nm3 / Serial: 5B134977135E7D13

결과값 출력도 전에 창이 닫혀서, cmd로 다시..

Correct!


[Next] (4주차) 이론

2022.07.19 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

 

IDA Pro 악성코드 정적분석 툴 사용법&이론 - week.04(전 과정 Review)

개요 * Easy_KeygenMe.exe 파일 실습 1. 레지스터 활용 분석 - 메모리 주소 및 스택 프레임의 이해 - ESP(스택 포인터), EBP(프레임 포인터), EIP 등 개념 정리 2. 어셈블리 명령어 이해 및 알고리즘 분석 - Pse

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
개요
* Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습
1. 디스어셈블리 상세 기능
- 스택 프레임 및 함수 호출 규약의 이해
- 동적 디버깅 사용 및 코드 실행
- 데이터 타입과 데이터 구조
- 기본 데이터/코드 변환
2. 스택/힙 할당 배열 및 구조체 접근

목차
0. Easy CrackMe 실습 이어서
1. 스택 프레임(stack frame)이란?
2. 레지스터: ESP, EBP, EIP, ECX, EAX
3. 어셈블리어: CMP, LEA, TEST
4. Debugger

[Review] (2주차) 실습 - Easy CrackMe (1)

2022.06.12 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

목차 - 샘플 파일을 이용하여 IDA Pro 실행 - 사용자 인터페이스 및 기본 사용법 이해 * 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요) 0. IDA Pro란? 1. 실행 파일 로드 2. 디스어셈..

sarahee.tistory.com


0. Easy CrackMe 실습 이어서

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Alt + T: Enter the search substring(문자열 및 어셈블리어 검색) > Tab: Ctrl + T
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

.text:004010B0                 cmp     [esp+68h+var_63], 61h ; 'a'

.text:004010BD                 push    offset Str2     ; "5y"

.text:004010D1                 mov     esi, offset aR3versing ; "R3versing"

.text:0040110D                 cmp     [esp+68h+String], 45h ; 'E'

strcmp: 문자열 비교 함수

strncmp: strcmp + n(검사할 문자의 개수 지정)

형태: char * strncmp( const char *s1, const char *s2, size_t n);

ASCII Table(10진 - 16진 - 문자 변환): 97 - 0x61 - a, 69 - 0x45 - E
ASCII Table
Str2 = 5y, aR3versing = R3versing


1. 스택 프레임(stack frame)이란?

스택에 할당된 메모리 블록, 호출된 함수에 지정

함수가 호출되면,

1) 함수 호출자가 파라미터 형태로 정보를 넘겨줄 때 어딘가에 저장되고, 호출된 함수가 정보를 찾게 해야 한다.

2) 함수의 작업을 위한 임시 저장소가 필요하다.

* 스택: 제한적으로 접근할 수 있는 자료 구조(LIFO, Last In First Out)

* 임시 저장소: 주로 지역 변수가 사용, 함수가 종료되면 더 이상 접근 불가


2. 레지스터: ESP, EBP, EIP, ECX, EAX

예제

32비트 x86 기반 컴퓨터의 컴파일된 함수 코드

void bar(int j, int k); // 호출할 함수
void demo_stackframe(int a, int b, int c) {
	int x;
    char buffer[64];
    int y;
    int z;
    // 스택 프레임 테스트 용도 외에는 다른 목적이 없는 함수
    bar(z, y);
}

지역 변수에 최소 76바이트(3개의 4바이트 정수, 64바이트 버퍼)가 필요

변수 오프셋 ESP 기반 스택 프레임
z [esp] 지역 변수
y [esp+4]
buffer [esp+8]
x [esp+72]
저장된 eip [esp+76]  
a [esp+80] 파라미터
b [esp+84]
c [esp+88]

모든 오프셋은 ESP가 바뀜에 따라 다시 조절

변수 오프셋 EBP 기반 스택 프레임
z [ebp-76] 지역 변수
y [ebp-72]
buffer [ebp-68]
x [ebp-4]
저장된 ebp [ebp] 저장된 레지스터
저장된 eip [ebp+4]  
a [ebp+8] 파라미터
b [ebp+12]
c [ebp+16]

개념 정리

* E: Extended(16bit  32bit system), 64bit에서는 R로 표현

ESP(stack pointer register)

: 현재의 스택 지점(stack의 가장 아래 부분), 스택의 크기를 조정할 때 사용

- 스택에 값을 넣을 때마다 ESP가 4만큼 줄어듦

EBP(base pointer)

: 프레임 포인터를 사용하는 함수를 가리킴(함수가 프레임 포인터를 쓰는지 여부의 분석이 필요할 때, 이 속성을 이용해 수작업으로 지정 가능 - 레지스터의 크기 보정 필요)

- 스택의 가장 윗 부분, 스택 프레임 형태로 저장된 함수의 지역 변수나 전달인자를 참조/변경시 사용하는 레지스터

- 고정적, 코드 유지에 용이(스택프레임 생성시)

EIP(instruction pointer)

: 실행할 명령의 주소


3. 어셈블리어: CMP, LEA, TEST

1) .text:004010B0

.text:004010B0 cmp [esp+68h+var_63], 61h ; 'a'

디스어셈블리 코드 설명
.text:00401080  var_63 스택 프레임에서 바로 참조할 수 있는 모든 변수의 목록을
변수 크기와 프레임 포인터에서 떨어진 거리와 함께 요약해 보여줌
.text:00401080  sub esp, 64h 스택 프레임에 지역 변수를 위한 98바이트(64h 대략 환산) 할당
.text:004010B0  cmp [esp+68h+var_63], 61h dest == source 이면 ZF(Zero Flag) = 1, CF(Carry Flag) = 0

CMP

cmp [esp+68h+var_63], 61h: esp+68h+var_63의 값이 61h 위치에 있는 값과 같은지 비교(값을 빼서 비교)

LEA

lea edi, [esp+68h+var_63]: esp+68h+var_63에 저장된 주소를 esp에 저장

[esp+68h+var_63] 우클릭시 &rarr; [esp+5]

2) .text:004010BD

.text:004010BD push offset Str2 ; "5y"

ECX(Extended Counter Register)

: 주로 반복 명령어 사용시 반복 카운터로 사용

EAX(Extended Accum ulator Register)

: 산술(덧셈, 곱셈, 나눗셈 등) 논리 연산을 수행할 때 사용, 함수의 반환값이 이 레지스터에 저장

TEST

: 인수1과 인수2 내용을 AND 연산하여 결과가 0이면 ZF = 1로 설정(보통 NULL check할 때 사용)

(두 operand가 0이 아닌 경우를 제외하고는 값을 판별하기 어려움 eax, eax와 같은 형태로 사용하여 0인지 아닌지 확인)

[esp+6Ch+Str1] 우클릭시 &rarr; [esp+10]

3) .text:004010D1

.text:004010D1 mov esi, offset aR3versing ; "R3versing"
[esp+70h+var_60] 우클릭시 &rarr; [esp+16]

4) .text:0040110D

.text:0040110D cmp [esp+68h+String], 45h ; 'E'
[esp+68h+String] 우클릭시 &rarr; [esp+4]

주소 해당 문자열 ESP 스택 포인터 10진수 변환 순번
.text:004010B0 a [esp+68h+var_63] [esp+5] 2
.text:004010BD 5y [esp+6Ch+Str1] [esp+10] 3
.text:004010D1 R3versing [esp+70h+var_60] [esp+16] 4
.text:0040110D E [esp+68h+String] [esp+4] 1

참조 순서: E - a - 5y - R3versing


4. Debugger

options: No debugger / Local Bochs debugger / Local Windows debugger / PIN tracer

Remote GDB debugger / Remote Windows debugger / Trace replayer / Windbg debugger

어셈블리 코드 파악을 위한 Local Windows debugger

Start a new process in the debugger or continue a debugged process 클릭시 > Yes
answer: Ea5yR3versing

 


[Next] (4주차) 실습 - Easy KeygenMe

2022.07.04 - [Security & Analysis/IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_KeygenMe)

개요 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com

 

728x90
728x90
728x90
반응형

개요

- 샘플 파일을 이용하여 IDA Pro 실행
- 사용자 인터페이스 및 기본 사용법 이해
* 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요)

목차
0. IDA Pro란?
1. 실행 파일 로드
2. 디스어셈블리 윈도우
3. 자주 쓰는 단축키
4. 추가 뷰 조회
5. Easy CrackMe 실습
6. IDA database 종료시 설정
7. 기타 분석 개념 정리

[Review] (1주차) 기본 이론

2022.05.22 - [IDA Pro] - IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

 

IDA Pro 악성코드 정적 분석 툴 사용법(기본 개념 이론) - week.01

목차 1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어 2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블 3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커 4. IDA, Hex-rays 개념 5. 세대별 언어 특징 1

sarahee.tistory.com


실습 진행 과정

1. IDA 파일 정보 확인
- IDA 로딩 파일(.idb), 데이터베이스 파일(.id0, .id1, .nam, .til)
2. IDA 툴 기능의 이해
- IDA 데스크탑/그래프 뷰 등 화면 동작/기능 파악
- 데이터 타입/코드 변환 등 설정 대화상자 기능 파악
- pseudo code 조회, 다른 함수로 변환 등
3. 코드 표기 이해(헥사 뷰, 디스어셈블리 뷰 동기화 등)

 


0. IDA Pro란?

Interactive Disassembler Professional, 핵스레이(Hex-Rays)사에서 배포한 디스어셈블러 도구

상호작용이 가능한 대화형으로 작성됐으며, 디스어셈블러 과정의 모든 부분을 수정, 조작, 재배치, 재정의 가능

- 악성코드 분석, 역공한 엔지니어링, 취약점 분석

분석하고자 하는 대상의 바이너리(파일)가 몇 비트 대상으로 컴파일 되었는지에 따라 결정 (32bit, 64bit)


1. 실행 파일 로드

IDA Pro는 파일 포맷과 프로세서 아키텍처를 인식

1) Load file

Portable executable for 80386 (PE) [pe.dll]: windows 운영체제에서 정의한 파일 포맷, 기본 윈도우 실행 파일로 인식

→ 운영체제 로더가 로딩하는 것처럼 메모리에 파일 매핑

MS-DOS executable (EXE) [dos.dll]: 확장 형태가 PE 파일

Binary file: IDA Pro가 파일을 원본(raw) 바이너리로 디스어셈블, 기본적으로 제공하는 파일 분석 방법

(IDA가 인식하지 못하는 경우 대비, 인식하는 로더가 없는 경우 저수준 분석 작업)

2) Processor type

MetaPC (disassemble all opcodes): 프로세스 모듈

- IDA 로더가 대부분 실행 파일 헤더 분석에 기초하여 알맞은 프로세스 선택

3) Options

Manual load: 파일을 로드하는 새로운 가상 주소를 명시하는 입력 박스를 볼 수 있음

Load file format Architecture
Portable executable for 80386 (PE) [pe.dll] x86 아키텍처, 32bit, RAM 4GB까지 가능(메모리 인식률)
Portable executable for AMD64 (PE) [pe64.dll] x64 아키텍처, 64bit

* PE 파일 포맷 기준

  • PE 파일(Portable Executable): 윈도우용 실행 파일 포맷
  • COFF(Common Object File Format): 유닉스용 공유 라이브러리 포맷
  • ELF(Executable Linking Format): 유닉스용 실행 파일 포맷

IDA 데이터베이스 파일 생성

1) id0: B 트리 형태의 데이터베이스

2) id1: 각 프로그램 바이트를 기술하는 플래그 데이터베이스

3) nam: 네임 창에서 이름 붙인 프로그램 위치의 인덱스 정보 데이터베이스

4) til: 해당 데이터베이스에서 정해준 지역 타입 정의 데이터베이스

* 각 파일의 포맷은 확인 불가(IDA 미제공)


2. 디스어셈블리 윈도우

(참고용) Optional Manual load 체크시 화면

디스어셈블리 윈도우는 두 모드 출력(Space bar로 전환) (그래프 모드 ↔ 텍스트(리스트) 모드)

1) 그래프 모드

플로우 차트 형식으로 단일 함수의 내역 조회, 행 번호/명령어 코드 배제

(면적을 최소한으로 줄이고자) 전반적으로 디스어셈블 코드 라인에 대한 정보가 많이 제외됨

초기 디스어셈블리 창(WinMain) - 바이너리를 조작하고 분석하는 주요 위치(어셈블리 코드 위치)

설정 변경

Options > General 팝업창(IDA Options) > Display disassembly line parts 에서

(1) Line prefixes (graph)

: 위치 찾기에 용이 (e.g. .text:0040131A)

(2) Number of opcode bytes (graph) = 6

: 기본 0으로 설정되어 있으며, 대부분의 명령어는 6바이트 이하이므로 6으로 변경 (e.g. 39 3D 64 85 40 00)

그래프 모드

화살표의 색깔과 방향을 이용하여 프로그램의 흐름을 파악할 수 있음

  • 녹색: 조건 점프(conditional jump)했을 경우(Yes)
  • 빨간색: 조건 점프가 아닐 경우(No)
  • 푸른색: 무조건 점프(unconditional jump)(연속 블록)

2) 텍스트 모드

바이너리 데이터 영역을 볼 때 사용

텍스트 모드

화살표 윈도우(arrows window): 출력 왼쪽, 프로그램의 비선형 흐름(nonlinear flow)를 보여줌

  • 실선: 무조건 점프
  • 점선: 조건 점프
  • (위를 향하는) 굵은 점선 화살표: 반복 구문 암시

 

IDA Pro의 자동 주석 기능

Options > General > ☑ Auto comments

  • sub link: 함수 시작 링크 (e.g. printf, sub_401080)
  • loc link: 목적지(location)로 점프하는 링크 (e.g. loc_401102, loc_4010FE)
  • offset link: 메모리 내의 오프셋 링크 (e.g. push offset Caption)

* offset link: 참조 위치로 점프해 출력할 때 유용, 메모리 내 정의한 위치로 이동

 

Compare Two Operands
Logical Compare
Logical Exclusive OR
Integer Subtraction with Borrow

...

앞으로/뒤로 가기 버튼

앞으로/뒤로 가기 버튼: 작업 내역 이동, 디스어셈블리 윈도우에서 새로운 위치를 탐색할 때마다 작업 내역에 추가

←: Esc / → : Ctrl + Enter

 

IDA Pro 인터페이스는 매우 다양해서, 원 위치로 되돌아오기 거의 불가능함

돌아오려면 Windows > Reset desktop 선택 (레이블 작업은 그대로, 윈도우와 GUI 인터페이스만 기본으로 복구)

저장하려면 Windows > Save desktop 선택

overview navigator, 탐색 밴드(navigation band)

로드한 바이너리 주소 영역을 코드에 따라 선형으로 보여줌

노란색 위치 화살표: 현재의 위치

하늘색: FLIRT로 인식한 라이브러리 코드 (COLLAPSED FUNCTION)

회색: 정의된 데이터

갈색: 정의되지 않은 데이터

분홍색: import, 외부 기호

빨간색: 컴파일러가 생성한 코드

파란색: 사용자가 작성한 코드(악성코드 분석 수행)

* IDA Pro는 FLIRT(Fast Library Identification and Recognition Technology)라 하여,

고속 라이브러리 식별과 인식 기술에 확장된 코드 시그니처를 포함하고 있음

→ 디스어셈블한 함수와 컴파일러가 추가된 라이브러리 코드를 식별해 label 가능


3. 자주 쓰는 단축키

Search > Next Code: 지정한 명령어를 담고 있는 다음 위치 커서로 이동

Search > Text: 전체 디스어셈블리 윈도우에서 특정 문자열 검색

Search > Sequence of Bytes: 특정 바이트 순서로 16진수 보기 윈도우에 있는 바이너리 검색 수행

G: Jump to address

G or Jump > Jump to File Offset 선택

특정 가상 주소로 점프 (e.g. 문자열, 셸코드, sub_401080, printf)

Ctrl + P: Choose function to jump to

Ctrl + P

특정 함수 조회 및 이동

F2: Break Point

F2

debbuging 모드의 break point

Pseudo Code

F5

IDA View에서 변환을 원하는 함수를 클릭한 뒤 F5 → 프로그래밍 변환되어 창 생성

특정 프로그래밍 언어의 문법이 아니라, 일반적인 언어로 코드를 흉내 내어 알고리즘을 써놓은 코드


4. 추가 뷰 조회

헥사 뷰(Hex View)

헥사 뷰(Hex View)

우클릭하여 Synchronize with > IDA View-A 확인

Edit 메뉴: 헥사 에디터 (수정 이후 commit이나 취소하여 view 모드로 돌아옴)

Data Format 메뉴로 표시되는 형식을 n진수 형태로 보여줌

구조체 창(Structures)

구조체 창(Structures)

바이너리에서 사용됐다고 판단된 C 구조체나 공용체 같은 복합 구조체를 보여줌

 

  • 열거 창(Enums): 구조체 창과 유사, IDA가 표준 열거형 데이터 타입을 찾았다면 표시
  • 임포트 창(Imports): 바이너리에서 분석된 임포트된 모든 함수 목록 조회(바이너리가 공유 라이브러리를 사용할 때만 유효함), 정적 링크된 바이너리는 외부 의존도가 없기 때문에 임포트될 사항이 없음
  • 익스포트 창(Exports): 파일의 진입점(entry point) 목록 조회
  • 문자열 창, 네임 창, 세그먼트 창, 시그니처 창, 타입 라이브러리 창, 함수 호출 창, Problems 창, ...

5. Easy CrackMe 실습

Easy_CrackMe.exe 실행시 팝업창
임의의 값을 넣어 확인 버튼 눌렀을 때 Incorrect Password
Quick view: Ctrl + 1 - Names view 선택

Ctrl + 1

Quick view 조회

Alt + T: Enter the search substring(문자열 및 어셈블리어 검색)

Alt + T

문자열 및 어셈블리어 검색

Ctrl + T

방금 팝업창에 조회된 문자열 검색(Tab 기능)

더블클릭하여 해당 함수로 이동

우클릭 > List cross references to... or Ctrl + X

xref, 커서가 가르키는 주소를 참조하는 곳을 조회

함수 확인
Text search 결과 (☑ Find all occurrences)
Alt + T > Congratulation
MessageBoxA 함수 영역

  • 성공 시의 메시지 출력(Congratulation !!)
  • 실패 시의 메시지 출력(Incorrect Password)

  • strcmp: 문자열 비교 함수
  • strncmp: strcmp + n(검사할 문자의 개수 지정)

input이 틀렸을 경우 MessageBox로 JMP하게 만드는 분기문 확인

[text:004010B5, 004010CD, 0040110B, 00401112]

'a' '5y' 'R3versing' 'E'

Ea5yR3versing


6. IDA database 종료시 설정

IDA 데이터베이스 닫기

데이터베이스가 닫혔던 상태 그대로의 환경에서 작업을 시작하게 해줌

IDB 파일 - IDA 데이터베이스 파일

현재 프로젝트 파일을 닫을 때 문제 없다면 압축되어 IDB 파일 생성 (기존 파일이 남아있다면 데이터베이스 손상)

- 가끔 크래시가 발생(e.g. IDA 버그, 설치 플러그인의 문제)


7. 기타 분석 개념 정리

0부 | 악성코드 분석 입문 (p.47~)

악성코드(malware)

일반적인 유형: 바이러스(virus), 트로이 목마(trojan horse), 웜(worm), 루트킷(rootkit), 스케어웨어(scareware), 스파이웨어(spyware)

목표: 네트워크 침입 대응에 필요한 정보를 알아내기 위함, 정확히 무슨 일이 발생했는가? 감염된 시스템과 파일이 무엇인까?

목적: 의심스러운 특정 바이너리가 하는 행위, 네트워크에서 탐지하는 방법, 피해 범위 측정

- 악성코드 분석을 통해 호스트 기반과 네트워크 기반의 시그니처 생성

* 네트워크 시그니처: 네트워크 트래픽 모니터링을 통해 악성 코드를 탐지할 때 사용

악성코드의 유형

1) 백도어(backdoor): 공격자의 접근 허용 목적으로 컴퓨터에 자기 자신을 설치하는 악성코드

2) 봇넷(botnet): 공격자가 시스템에 접속 가능, 동일한 봇넷에 감염된 모든 컴퓨터가 하나의 명령 제어(C&C, Command-and-Control) 서버로부터 동일한 명령어 수신

3) 다운로더(downloader): 다른 악성코드를 다운로드할 목적만으로 존재하는 악성코드

(1) 시스템에 처음 접근 권한을 얻으면 공격자는 다운로더를 설치

(2) 다운로더 프로그램은 추가 악성코드를 다운로드하고 설치

4) 정보 유출 악성코드(information-stealing malware): 피해자의 컴퓨터에서 정보를 수집해서 공격자에게 전송하는 악성코드

- 이메일이나 온라인 뱅킹 같은 온라인 거래에 접근 권한을 얻고자 할 때 사용

(e.g. 스니퍼, 패스워드 해시 수집기, 키로거)

5) 실행기(launcher): 다른 악성 프로그램을 실행할 때 사용하는 악성 프로그램

- 시스템의 상위 권한이나 은폐를 위해 다른 악성 프로그램을 실행할 때 이전 기법과 다른 기법을 사용

6) 루트킷(rootkit): 다른 코드 내에서 자신의 존재를 숨기도록 설계한 악성코드

- 백도어 같은 다른 악성코드를 함께 사용(공격자의 원격 접속 허용과 피해자의 코드 탐지를 어렵게 만들기 위함)

7) 스케어웨어(scareware): 감염된 사용자가 뭔가를 구매하게 겁을 주는 악성코드

8) 스팸 전송 악성코드(spam-sending malware): 사용자의 장비를 감염시켜 스팸을 전송하는 데 이용하는 악성코드

9) 웜/바이러스(worm/virus): 자기 자신을 복제해 추가로 컴퓨터를 감염

 

1부 | 기초 분석 (p.55~)

악성 여부를 판단하는 안티바이러스 도구 사용

악성코드를 판별하는 해시 사용

파일의 문자열, 함수, 헤더에서 개략적인 정보 수집

 

안티바이러스 스캐닝 - 해시:악성코드에 대한 지문 - 문자열 검색

안전한 해시 알고리즘 1(SHA-1, Secure Hash Algorithm)

메시지 다이제스트 알고리즘 5(MD5, Message-Digest Algorithm)

 


[Next] (3주차) 실습 - Easy CrackMe (2)

2022.07.04 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe, Easy_KeygenMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.03(Easy_CrackMe, Easy_KeygenMe) (1)

목차 * Easy_CrackMe.exe 실습 리뷰 및 Easy_KeygenMe.exe 파일 실습 1. 디스어셈블리 상세 기능 - 스택 프레임 및 함수 호출 규약의 이해 - 동적 디버깅 사용 및 코드 실행 - 데이터 타입과 데이터 구조 - 기

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
목차
1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어
2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블
3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커
4. IDA, Hex-rays 개념
5. 세대별 언어 특징

1. 컴퓨터 언어: 기계어, 어셈블리어, 고급언어

기계어 - 어셈블리어 - 고급언어

1) 기계어(Machine Language)

개념: CPU가 별다른 해석(컴파일) 없이 읽을 수 있는 프로그래밍 언어(컴퓨터가 사용하는 언어), 프로그램을 나타내는 가장 낮은 단계

예시: 

1000 1011 0100 0101 1111 1000 -> 8b 45 f8

0000 0011 0100 0101 1111 1100 -> 03 45 fc

 

2) 어셈블리어(Assembly Language)

개념: 기계어의 숫자를 사람들이 이해하기 쉽게 만든 언어, CPU의 명령어들을 영어 약자로 표기(기호와 CPU의 명령어가 일대일 대응)

예시: 1000 1011 → MOV (저급 언어)

 

3) 고급 언어(High-Level Language)

개념: 사람들이 이해하기 편하도록 만들어진 프로그래밍 언어(사람의 언어에 가까운지를 표현하는 단어)

특징: 특정한 컴퓨터의 구조나 프로세서와 무관하게, 독립적으로 프로그램을 작성

비교: 프로그래밍 언어의 문법 구조가 기계어와 유사하면 '저급 언어(Low-Level Language)'

예시: 고급 언어(C++, Java, C#), 중급 언어(Middle-Level Language, C)

2. 언어 번역: 컴파일/디컴파일, 어셈블/디스어셈블

  • 어셈블러(assembler): 기호를 이진수로 변환하는 프로그램(어셈블리어 → 기계어)
  • 컴파일러(Compiler): 고급 언어로 작성된 명령어를 기계어로 변경하는 프로그램

어셈블러와 컴파일 작업을 역으로 수행하는 툴: 디스어셈블러와 디컴파일러

  • 디스어셈블러: 어셈블리 과정을 되돌려서 결과물로 어셈블 코드 생성(기계어 → 어셈블리어)
  • 디컴파일러: 어셈블리/기계어(입력) → 고급언어(출력)

전통적인 소프트웨어 개발 모델은 컴파일러, 어셈블러, 링커로 실행 파일을 만든다.

* 링킹(linking): 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드/실행 가능한 한 개의 파일로 만드는 작업

* 링커(linker): 링크 에디터(link editor), 소프트웨어 개발에서 독립적인 컴파일을 가능하게 하는 프로그램

 

컴파일러가 만들어낸 하나 이상의 목적 파일을 가져와 단일 실행 프로그램으로 병합

다시 말해서, 프로그램이나 라이브러리 등 컴파일 이후 연결하는 과정

 

Build Process(C): 전처리기 - 컴파일러 - 어셈블러 - 링커

3. 빌드 과정: 전처리기, 컴파일러, 어셈블러, 링커

gcc program.c
gcc program.c -o program

1) 전처리기(Preprocessor): 전처리기 구문 처리(디렉토리/컴파일러 라이브러리 폴더에서 헤더파일 include, define 값 치환)

gcc -E program.c -o program.i
include <stdio.h>
defind A 10

 

2) 컴파일러(Compiler): 고수준 언어를 저수준 언어(기계어와 가까운)로 나타나는 역할

gcc -S program.i -o program.s
.file   "program.c"
        .section        .rodata
.LC0:
        .string "%d + %d = %d\n"
        .text
        .globl  main
        .type   main, @function
main:

3) 어셈블러(Assembler): 완전히 기계어로 바꿔주는 역할

gcc -c program.s -o program.o
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^A^@>^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@È^B^@^@^@^@^@^@^@^@^@^@@^@^@^@^@^@@^@^M^@
^@UH<89>åH<83>ì^PÇEü
^@^@^@ÇEø^T^@^@^@<8b>Eø<8b>Uü^AÐ<89>Eô<8b>Mô<8b>Uø<8b>Eü<89>Æ¿^@^@^@^@¸^@^@^@^@è^@^@^@^@ÉÃ%d + %d = %d

 

4) 링커(Linker): 여러 개의 오브젝트 파일 혹은 라이브러리를 합칠 때 사용

gcc program.o -o program.exe

5) 실행

./program.exe

4. IDA, Hex-rays 개념

IDA(Interactive Disassembler): malware reverse engineering tools

  • IDA Pro: 기본적으로 디스어셈블러(Dis-Assembler)의 속성을 가짐
  • Hex-rays: 디컴파일러(De-Compiler) 플러그인

디스어셈블리란?

disassembly: (명, n)분해, disassemble: (동, v)분해하다

 

디스어셈블리가 필요한 이유: 소스코드가 없을 때 프로그램을 이해하는데 주로 사용

1) 멀웨어 분석

동적 분석(dynamic analysis): 제어할 수 있는 환경하에서(샌드박스) 멀웨어를 실행시켜 가며 여러 가지 시스템 툴을 사용해 행동을 관측하는 것

정적 분석(static analysis): 프로그램 코드를 읽어가며 프로그램의 행동 분석

2) 취약점 분석: 취약점이 있는 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

취약점 발견, 취약점 분석, 개발

프로그램의 잠재적 취약점 발견: 동적분석 퍼징(Fuzzing) 이용

* Fuzzing: 취약점 발견을 위한 기술, 대량의 고유한 입력 값 생성하고 어떤 것이 프로그램의 동작을 문제로 일으키는지 파악/분석/이용

3) 소프트웨어 상호 연동: 상호 연동이 필요한 프로그램의 소스를 알지 못할 경우 분석이 필요할 때

4) 컴파일러 검증: 컴파일러가 생성한 코드가 성능이 제대로 됐는지, 결과물이 제대로 됐는지 검증이 필요할 때

5) 디버깅 디스플레이: 디버깅 중 프로그램의 인스트럭션을 표시하고자 할 때


5. 세대별 언어 특징

1세대 언어

대표: 기계어로 비유됨

특징: 가장 저수준 형태로, 1과 0으로 구성. 16진수(hexa decimal)

2세대 언어

대표: 어셈블리 언어

특징: 니모닉(mnemonic)으로 인해 프로그래머가 연산을 기억하기 쉽게 변화함

* 니모닉: 짧으면서 특징 있는 문자열 (니모닉 코드: 연상 기호 코드, 기계어와 일대일로 대응하는 명령어)

* 어셈블러: 어셈블리 언어 프로그램을 실행 가능한 기계어로 바꿔주는 툴

3세대 언어

대표: fortran, cobol, C, JAVA

특징: 의미 단위로 블록을 묶음, 플랫폼(기계, H/W) 독립적인 형태로 작성

4세대 언어

대표: SQL, Visual C++, Visual Basic

특징: 비절차 언어(절차 언어의 대표는 C), 특정 응용 프로그램과 함께 지원(DB 접근에 이용되는 SQL 등)

5세대 언어

대표: Prolog(부족)

특징: 초고급언어, 인공지능 분야의 원리를 사용하는 시스템을 위해 개발된 언어(자연어 처리 등)

 


[Next] 2주차 실습(Easy CrackMe.exe)

2022.06.12 - [IDA Pro] - IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

 

IDA Pro 악성코드 정적분석 툴 사용법&실습 - week.02(Easy_CrackMe) (1)

목차 - 샘플 파일을 이용하여 IDA Pro 실행 - 사용자 인터페이스 및 기본 사용법 이해 * 샘플 자료: reversing.kr > 상단 Challenge 버튼 > Easy Crack (login 필요) 0. IDA Pro란? 1. 실행 파일 로드 2. 디스어셈..

sarahee.tistory.com

 

728x90
728x90
728x90
반응형
The IDA Pro Book (2nd Edition) 한국어판 - 리버스 엔지니어링에 날개를 달다

 - 목차 - 

 

1부 IDA 소개

1장 | 디스어셈블러 소개

2장 | 리버싱과 디승셈블리툴

3장 | IDA 프로 배경 지식

 

2부 IDA 기본 사용법

4장 | IDA 시작

5장 | IDA 데이터 디스플레이

6장 | 디스어셈블리 살펴보기

7장 | 디스어셈블리 다루기

8장 | 데이터 타입과 데이터 구조

9장 | 상호 참조와 그래프

10장 | 여러 가지 IDA

 

3부 IDA 고급 사용법

11장 | IDA 커스터마이징

12장 | FLIRT 시그니처로 라이브러리 인식

13장 | IDA 심층 탐구

14장 | 바이너리 패칭과 IDA 제약 사항

 

4부 IDA의 기능 확장

15장 | IDC 스크립팅

16장 | IDA SDK

17장 | IDA 플러그인 아키텍처

18장 | 바이너리 파일과 IDA 로더 모듈

19장 | IDA 프로세서 모듈

 

5부 실제 애플리케이션

20장 | 다양한 컴파일러

21장 | 난독화된 코드 분석

22장 | 취약점 분석

23장 | 실제 IDA 플러그인

 

6부 IDA 디버거

24장 | IDA 디버거

25장 | 디스어셈블러/디버거 통합

26장 | 추가 디버거 기능

 

부록 A IDA 5.0 무료 버전 사용

부록 B IDC/SDK 상호 참조

 

Practical Malware Analysis (실전 악성코드와 멀웨어 분석) / 마이클 시코스키·앤드류 호닉 지음, 여성구·구형준·박호진 옮김 / 에이콘

 - 목차 - 

 

0장 | 악성코드 분석 입문

 

1부 기초 분석

1장 | 기초 정적 분석 기법

2장 | 가상 정적 분석 기법

3장 | 기초 동적 분석

 

2부 고급 정적 분석

4장 | X86 디스어셈블리 속성 과정

5장 | IDA Pro

6장 | 어셈블리어에서의 C 코드 구조 식별

7장 | 악의적인 윈도우 프로그램 분석

 

3부 고급 동적 분석

8장 | 디버깅

9장 | OllyDbg

10장 | WinDbg를 이용한 커널 디버깅

 

4부 악성코드의 기능

11장 | 악성코드의 행위 특성

12장 | 위장 악성코드 실행

13장 | 데이터 인코딩

14장 | 악성코드 기반 네트워크 시그니처

 

5부 안티리버싱

15장 | 안티디스어셈블리

16장 | 안티디버깅

17장 | 안티가상머신 기법

18장 | 패커와 언패킹

 

6부 특별한 주제

19장 | 셸코드 분석

20장 | C++ 분석

21장 | 64비트 악성코드

 

부록

부록A | 주요 윈도우 함수

부록B | 악성코드 분석 도구

부록C | 실습 문제 풀이

 

 

728x90
728x90

+ Recent posts