x86 Assembly : Essential Part(2)

곽무경·2022년 6월 28일
0

System Hacking

목록 보기
4/27

스택

push val : val을 스택 최상단에 쌓음

pop reg : 스택 최상단의 값을 꺼내서 reg에 대입

프로시저

특성 기능을 수행하는 코드 조각
호출(Call) : 프로시저를 부르는 행위
반환(Return) : 프로시저에서 돌아오는 것

call addr : addr에 위치한 프로시저 호출
다음 실행될 코드를 스택에 push하고, ripaddr로 이동

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

ret : return address로 반환
원래의 흐름으로 복귀(다음 명령의 주소가 0x400005)

스택 프레임의 할당과 해제

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

시스템 콜

필요한 기능과 인자에 대한 정보를 레지스터로 전달하면, 커널이 이를 읽어서 요청을 처리

인자 순서 : rdxrsirdxrcxr8r9stack

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 sockaddr * addrint addrlen

rdi → 0x01 이면 std
rsi → 문자열 포인터
rdx → 길이

0개의 댓글