push val : val을 스택 최상단에 쌓음
pop reg : 스택 최상단의 값을 꺼내서 reg에 대입
특성 기능을 수행하는 코드 조각
호출(Call) : 프로시저를 부르는 행위
반환(Return) : 프로시저에서 돌아오는 것
call addr : addr에 위치한 프로시저 호출
다음 실행될 코드를 스택에 push하고, rip을 addr로 이동
leave : 스택 프레임 정리
스택 프레임 : 함수별로 자신의 지역변수 또는 연산과정에서 부가적으로 생겨나는 임시 값들을 저장하는 영역, 함수별로 사용하는 영역을 구분하기 위해 스택프레임이 사용된다.
ret : return address로 반환
원래의 흐름으로 복귀(다음 명령의 주소가 0x400005)
- 함수가 호출되면 다음 명령의 주소가 스택에 push
- 기존의 스택 프레임을 저장하기 위해 기존의 rbp를 스택에 push
- 새로운 스택 프레임을 만들기 위해 rbp를 rsp로 이동
- 새로운 스택 프레임의 공간을 확장하기 위해 rsp를 적정량 빼기
- 할당한 스택 프레임에서 여러 연산 수행
- leave 연산
rsp를 rbp로 이동
저장해뒀던 기존의 rbp를 꺼내서 rbp에 대입(leave 연산) → 원래의 스택 프레임으로 복귀- ret 연산
저장해뒀던 반환 주소를 꺼내서 원래의 실행 흐름으로 복귀
필요한 기능과 인자에 대한 정보를 레지스터로 전달하면, 커널이 이를 읽어서 요청을 처리
인자 순서 : rdx→rsi→rdx→rcx→r8→r9→stack
syscall rax rdi rsi rdx read 0x00 unsigned int fd char *buf size_t count write 0x01 unsigned int fd const char *buf size_t count open 0x02 const char *filename int flags umode_t mode close 0x03 unsigned int fd mprotect 0x0a unsigned long start size_t len unsigned long prot connect 0x2a int sockfd struct sockaddr * addr int addrlen rdi → 0x01 이면 std
rsi → 문자열 포인터
rdx → 길이