Iriton's log

x86 Assembly 본문

Pwnable/Study

x86 Assembly

Iriton 2024. 3. 19. 23:32

*본 포스트는 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