Iriton's log
x86 Assembly 본문
*본 포스트는 Dreamhack - Systemhacking Lecture 을 참고하여 작성되었습니다.
어셈블리어와 x86-64
x64 어셈블리 언어
명령 코드
데이터 이동(Data Transfer) | mov, lea |
산술 연산(Arithmetic) | inc, dec, add, sub |
논리 연산(Logical) | and, or, xor, not |
비교(Comparison) | cmp, test |
분기(Branch) | jmp, je, jg |
스택(Stack) | push, pop |
프로시져(Procedure) | call, ret, leave |
시스템 콜(System call) | syscall |
피연산자
- 상수
- 레지스터
- 메모리
- []로 둘러싸인 것으로 표현되며 앞에 크기 지정자가 추가될 수 있다.
- 타입
- BYTE - 1
- WORD - 2
- DWORD - 4
- QWORD - 8
x86-64 어셈블리 명령어
데이터 이동
- mov dst, src
- : src에 들어 있는 값을 dst에 대입
- lea dst, src
- : src의 주소를 dst에 저장
산술 연산
- add dst, src
- : dst에 src 값을 더함
- sub dst, src
- : dst에서 src 값을 뻄
- inc op
- op의 값을 1 증가
- dec op
- op의 값을 1 감소
논리 연산
- and dst, src
- : dst와 src의 비트가 모두 1이면 1 아니면 0
- or dst, src
- : dst와 src의 비트 중 하나라도 1이면 1 아니면 0
- xor dst, src
- : dst와 src 비트가 서로 다르면 1 같으면 0
- not op
- : op 비트 전부 반전 1이면 0으로 0이면 1으로
비교
- cmp op1, op2
- : 두 피연산자를 빼서 대소를 비교한다. 그 값이 0이 되면 ZF가 설정된다. 해당 플래그로 두 값이 같은지 다른지 판별 가능
- test op1, op2
- : 두 피연산자에 AND 비트 연산. 같은 값으로 AND 연산을 하면 값이 0이 되므로 ZF는 1이 된다.
분기
- jmp addr: addr로 이동
- je addr: 직전에 비교한 두 피연산자가 같으면 점프
- jg addr: 직전에 비교한 두 연산자 중 전자가 더 크면 점프
스택
- push val: 스택 최상단에 val을 쌓음
- pop reg: 스택 최상단의 값을 꺼내서 reg에 대입
프로시저
: 특정 기능을 수행하는 코드 조각
- call addr: addr에 위치한 프로시져 호출
- leave: 스택 프레임 정리
- ret: 리턴 어드레스로 반환
시스템콜
- 커널 모드
- : OS가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한
- 유저 모드
- : 운영체제가 사용자에게 부여하는 권한
- 시스템 콜
- : 유저 모드에서 커널 모드의 시스템 소프트웨어에게 어떤 동작을 요청하기 위해 사용
'Pwnable > Study' 카테고리의 다른 글
Background: Calling Convention (0) | 2024.04.01 |
---|---|
Exploit Tech: Shellcode (0) | 2024.03.27 |
Tool: gdb & pwntools (0) | 2024.03.20 |
Background: Linux Memory Layout (0) | 2024.03.19 |
Background: Computer Architecture (1) | 2024.03.19 |
Comments