━━━━ ◇ ━━━━
해킹/해킹, 취약점, 악성코드, 솔루션

어셈블리어란?

728x90
반응형

출처

https://silverzoo-igutjgut.tistory.com/31

https://velog.io/@dung002/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4

 

어셈블리어의 명령어 형식

어셈블리어의 명령어 형식은 Label, OP, Operand로 구성됩니다.

Label : 데이터를 기억할 기억장소, 또는 분기할 위치, 기호 상수 등에 대한 기호를 기술하는 부분으로 생략할 수 있다.

OP : 명령어(OP-Code)를 기술하는 부분입니다.

Operand : OP-code가 연산을 수행하기 위한 연산의 대상이 되는 Literal(상수,데이터)나 주소, Register 번호 등을 기술하는 부분입니다.

어셈블러와 어셈블 과정 

어셈블러는 어셈블리어로 작성된 원시 프로그램을 기계어로 된 목적 프로그램으로 어셈블하는 언어 번역 프로그램입니다.

1. 어셈블리어로 작성된 원시 프로그램을 목적프로그램으로 어셈블 하는 과정은 크게 2단계(Pass)로 나누어서 수행됩니다.

2. 두개의 Pass를 사용하면 기호를 정의하기 전에 사용할 수 있는 프로그램 작업이 용이합니다.

 

어셈블러의 종류

1. 단일 패스 어셈블러 : 원시 프로그램을 하나의 명령문씩 읽는 즉시 기계어로 번역하여 목적프로그램으로 만듭니다.

2. 이중 패스 어셈블러 : 원시 프로그램을 앞에서부터 끝까지 읽어서 1단계의 작업을 수행한 후 다시 처음부터 읽으면서 1단계에서 수행한 결과를 사용하여 완전한 목적 프로그램을 만듭니다.

3. 크로스 어셈블러 : 현재 사용하는 컴퓨터와는 다른 명령 형태로 동작하는 컴퓨터에서 사용할 프로그램을 어셈블 할 때 사용되는 어셈블러를 말합니다. 현재 어셈블하는 컴퓨터가 아닌 어셈블된 프로그램을 실행시킬 컴퓨터에 맞게 목적 프로그램을 생성합니다.

프로그램(소프트웨어)분석

→ assembly로 짜여져있는 프로그램이라고 가정했을 때 diassembler(역어셈블러) 2진수(기계어코드)로 변환 가능

구글에서 diassembler 도구 사이트 검색

 

소프트웨어 분석의 목적은 well made 판별, 취약점 유무 파악

 

<어셈블리어>

https://velog.io/@dung002/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4

 

(명령어 - Operation Code: opcode) (피연산자-Operand: 상수 / 레지스터 / 메모리[])

메모리 주소의 값은 대괄호를 쳐서 작성한다.

 

add rax, rdx

데이터 이동 - mov, lea

mov dst, src

mov rdi(목적지), rsi(원본) // rsi의 값을 목적지 rdi값에 대입

mov QWORD PTR[rdi], rsi // rsi의 값을 rdi가 가리키는 주소에 대입

lea rsi, [rbx+8?*rcx]-[유효 주소 - EA(Effective Address) // rbx+8*rcx유효 주소값을 rsi에 대입

산술 연산 - inc, dec, add, sub

add(sub) rax, 3 // rax +(-) 3

add rax, WORD PTR[rdi] // rax + rdi값의 WORD크기

inc eax // eax + 1

dec eax // eax - 1

논리 연산 - and(비트가 모두 1일 경우 1), or(비트 중 하나라도 1일 경우 1), xor(비트가 같으면 0, 다르면 1), not(비트가 1일 경우 0, 0일 경우 1)

비교 연산 - cmp, test                     

mov rax, 0xA

mov rbx, 0xA

cmp rax, rbx // 피연산자의 값을 빼서 대소를 비교

xor rax, rax

test rax, rax //

분기 - jmp, je, jg

1:xor rax, rax

2: jmp 1 // jump to 1번 코트도

1: mov rax, 0xcafebabe

2: mov rbx\, 0xcafebabe

3: cmp rax, rbx

4: jg 1  // jump if greater

 

1: mov rax, 0x31337

2: mov rbx\, 0x12337

3: cmp rax, rbx

4: jg 1  // jump if greater(전자의 값이 클 경우)

 

스택 - push(값을 가져오는 것), pop(값을 빼내어오는 것)

rsp -=8

[rsp] = val

프로시저 - call(프로시저 호출), ret, leave(스택프레임 정리)

procedure: 특정 기능을 수행하는 코드 조각

1.     command: cat flag

2.     System utility: /bin/cat

3.     Syscall: open, read, …

4.     Low level operation: fs, input/output …

시스템 콜 - syscall

[Register]

rax = 0x1

rdi(출력스트림) = 0x1 0x00 -> 화면출력안함

rsi(버퍼에 저장되는값(데이터)) = 0x401000

rdx(길이) = 0xb

[Memory]

0x401000 | “Hello Wo”(8자리)

0x401008 | “rld”(3자리)

[code]

syscall → write(0x1, 0x401000, 0xb)

           write(화면에 출력해, 0x401000 메모리 주소에서부터, 11자리수만큼)

result → Hello World 문자열 출력

파란 레지스터를 실행하게 되면 Hello World라는 문자열이 출력된다는 뜻이다.

 

버퍼 메모리 - 임시저장공간

 

크기지정자

BYTE - WORD - DWORD - QWORD

(1)    (2)     (4)       (8)

728x90
반응형
COMMENT