출처
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)
'해킹 > 해킹, 취약점, 악성코드, 솔루션' 카테고리의 다른 글
어셈블리 무확장자 컴파일 (0) | 2023.04.17 |
---|---|
어셈블리어 문제 풀이 (0) | 2023.04.17 |
어셈블리(Assembly), 힙(heap), 스택(stack) (0) | 2023.04.17 |
Mod_evasive 설치와 DdoS, Brute Force 방어 (0) | 2023.04.17 |
WAF(Web Application Firewall) 구축 및 정책 작성 (0) | 2023.04.16 |