x86 Assembly : Essential Part (2)

·2023년 1월 16일
0

System Hacking

목록 보기
6/10

x86 어셈블리
: 기본적인 x86-64 어셈블리어에 대한 이해

Opcode: 스택 ( push, pop )

  • push val : val을 스택 최상단에 쌓음
rsp -= 8
[rsp] = val

  • pop reg : 스택 최상단의 값을 꺼내서 reg에 대입
rsp += 8
reg = [rsp-8]

Opcode: 프로시저 ( call, leave, ret )

프로시저(Procedure) : 특정 기능을 수행하는 코드 조각
-> 반복되는 연산을 프로시저 호출로 대체 가능, 전체 코드의 크기를 줄임
-> 기능별로 코드 조각에 이름을 붙일 수 있게 되어 코드의 가독성을 크게 높일 수 있음

호출(Call) : 프로시저를 부르는 행위
반환(Return) : 프로시저에서 돌아오는 것

  • call addr : addr에 위치한 프로시저 호출
push return_address
jmp addr

  • leave : 스택프레임 정리
mov rsp, rbp
pop rbp

스택 프레임 : 함수별로 자신의 지역변수 또는 연산과정에서 부가적으로 생겨나는 임시 값들을 저장하는 영역, 함수별로 사용하는 영역을 구분하기 위해 스택프레임이 사용됨

  • ret : return address로 반환
pop rip

스택 프레임의 할당과 해제

  1. func 함수 호출 후 다음 명령의 주소는 스택에 push 됨
  2. 기존의 스택 프레임을 저장하기 위해 기존의 rbp를 스택에 push
  3. 새로운 스택 프레임을 만들기 위해 rbp를 rsp로 이동
  4. 새로운 스택 프레임의 공간을 확장하기 위해 rsp를 몇 정도 뺌
  5. 할당한 스택 프레임에서 지역 변수 할당, 여러 연산 수행
  6. 저장해뒀던 기존의 rbp를 꺼내 rbp에 대입 (leave 연산) → 원래의 스택 프레임으로 복귀
  7. 저장해뒀던 반환 주소를 꺼내서 (ret 연산) 원래의 실행 흐름으로 복귀

Opcode: 시스템 콜

시스템 콜 (system call, syscall) 은 유저 모드에서 커널 모드의 시스템 소프트웨어에게 어떠한 동작을 하기 위한 도움 요청
필요한 기능과 인자에 대한 정보를 레지스터로 전달하면, 커널이 이를 읽어서 요청을 처리

  • 커널 모드 : 운영체제가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한
    시스템의 모든 부분을 제어할 수 있기 때문에 해킹 발생 경우 시스템 다운
  • 유저 모드 : 운영체제가 사용자에게 부여하는 권한
    해킹이 발생해도, 해커가 유저 모드의 권한까지 밖에 획득하지 못하기 때문에 해커로부터 커널의 막강한 권한을 보호 가능

요청: rax
인자 순서: rdi → rsi → rdx → rcx → r8 → r9 → stack

syscallraxrdirsirdx
read0x00unsigned int fdchar *bufsize_t count
write0x01unsigned int fdconst char *bufsize_t count
open0x02const char *filenameint flagsumode_t mode
close0x03unsigned int fd
mprotect0x0aunsigned long startsize_t lenunsigned long prot
connect0x2aint sockfdstruct sockaddrn * addrint addrlen
execve0x3aconst char *filenameconst char const argvconst char const envp

rdi - 파일 디스크립터
rsi - 문자형 포인터 (주소)
rdx - 바이트 사이즈

0개의 댓글