CIDY
어셈블리 정리(문법구조, 명령어) 본문
*어셈블리 문법 구조(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
나중에 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바이트
'잡담..' 카테고리의 다른 글
Core파일 생성 안 될 때 (0) | 2022.07.01 |
---|---|
gdb-peda에서 디버깅 시 인자 전달&입력값 주기 (0) | 2022.07.01 |
pwntools에서 recv로 받아온 것 자르기 (0) | 2022.06.30 |
리눅스(Ubuntu-20.04)에서 vi편집기로 파일 만들기 (0) | 2022.06.29 |
리눅스(Ubuntu-20.04)에서 nasm설치 및 사용해보기 (0) | 2022.06.27 |