Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

어셈블리 정리(문법구조, 명령어) 본문

잡담..

어셈블리 정리(문법구조, 명령어)

CIDY 2022. 6. 30. 23:37

*어셈블리 문법 구조(intel기준)

 

어셈블리는 기본적으로         < 명령어 dst, src >       구조임

 

EX) mov eax, 3

에서 mov == opcode, eax == operand 1, 3 == operand 2

 

 

 

*어셈블리 명령어

 

;---------------------------------------------------------

mov, lea -> 데이터 옮기기

and, or, xor, not -> 논리연산자

cmp, test -> 비교연산자

call, ret, leave -> 프로시져

push, pop -> 스택에 넣고빼는거

jmp, je, jg -> 분기문

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

syscall -> 시스템콜(32비트에서는 int 0x80)

;---------------------------------------------------------

 

이정도만 알아도 될것같음. 

 

 

+참고로, mov와 lea가 무슨 차이냐면...

 

mov는 값의 이동임. 예를들어 mov rdi, rsi 하면 rsi에 든 값을 rdi에 넣으라는 뜻.

lea는 주소 대입임. lea rsi, [rbx + 0x8]이면 rbx + 0x8이라는 주소 자체를 rsi에 대입하라는 뜻. 만약 mov rsi, [rbx + 0x8]이면 rbx + 0x8의 주소에 있는 값을 rsi에 저장하라는 뜻.

 

* [  ] <- 이 괄호는 C로 치면 참조기호( * ) 같은건데, 예를 들어 mov QWORD PTR[rdi], rsi 하면 rsi에 있는 값을 rdi가 가리키는 주소에 넣으라는 뜻

 

 

+그리고 비교 연산자는 비교 연산의 결과로 플래그 레지스터를 설정한다고 함.

 

-> cmp하면 두 개를 빼서 대소비교. 뺀 결과를 저장하거나 그러지는 않음. 예를들어 뺐는데 0이면 ZF = 1

-> test하면 두 개를 and해서 비교. 이것도 결과저장은 X. 만약 xor rax, rax; test rax, rax 하면 0이니까 ZF = 1

 

 

+점프는 종류가 다양한데 대충보면 알 수 있음(오퍼랜드 1개(주소)임)

 

jmp -> 걍 점프

je -> 직전 비교연산이 같으면 jmp

jg -> 직전 비교연산에서 첫번째 피연산자가 크면 jmp

jne -> 직전 비교연산이 다르면 jmp

등...

 

*참고로 jmp한다는 것은 rip이동 == 실행흐름 이동

 

 

+스택은 push pop으로 쌓고 뺌

 

스택은 말 그대로 쌓이는거라 last in first out. push 랑 pop도 마찬가지.

얘네도 오퍼랜드 1개인데, push val 하면 스택 최상단에 val쌓이고 rsp는 자동으로 마이너스됨. (rsp -= 8; [rsp] = val)

pop rax 하면 맨 위에 있는 값을 꺼내서 rax에 담음. (rsp += 8; rax = [rsp - 8])

 

 

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

 

반복되는 연산을 프로시저 호출로 대체 가능함.

 

-> leave는 사실 mov esp, ebp; pop ebp 인데 leave하나를 호출하는걸로 대체하는 것. (습관적으로 32비트 체제로 씀..)

 

-> call addr는 addr에 위치한 프로시저를 호출하는 것. (프로시저를 '호출한다'라고 하고, 프로시저에서 돌아오는 것을 '반환'이라고 함.) 프로시저 실행 후 원래 실행 흐름으로 돌아와야 하니까 스택에 호출 직후 명령어 주소를 저장해두고 rip를 프로시저로 이동시킴. push ret_addr; jmp addr)

 

-> ret은 사실 pop rip; jmp rip임 ret주소를 rip에 넣고 거기로 jmp.

 

 

+syscall

 

유저 모드에서 커널모드로 권한 요청하는 것. 

자세한 건 여기서 설명함 ↓

https://orcinus-orca.tistory.com/11

 

[Ck_수업정리] 4주차(shellcode 만들기)

4주차 수업 정리가 꽤 길어지기도 했고, 쉘코드를 만드는 부분은 조금 재미있는 부분이라 따로 정리한다. *System Call 운영체제에서는 연결된 모든 하드웨어와 소프트웨어를 마음대로 제어할 수

orcinus-orca.tistory.com

 

나중에 system call table을 쓸 일이 있을텐데, 어차피 엄청 많아서 못 외우니까 그냥 그렇게 세팅하고 syscall하면 그게 실행된다~ 정도만 알아두자.

 

 

 

*피연산자

상수, 레지스터, 메모리 -> 이 3가지가 피연산자로 가능 (메모리는 [~~] 이거말하는거임)

 

EX) QWORD PTR [0x2914850] -> 0x2914850의 데이터를 8바이트 참조

EX) WORD PTR [rbp - 0x4] -> rbp - 0x4가 가리키는 주소에서 데이터 2바이트 참조

 

QWORD == 8바이트, DWORD == 4바이트, WORD == 2바이트, BYTE == 1바이트