https://www.lazenca.net/pages/viewpage.action?pageId=16810038
return address 영역을 공유 라이브러리 함수의 주소로 변경해 함수를 호출하는 방식
→ NX bit 우회 가능
목표: system함수의 주소와 "/bin/sh"의 주소를 알아내 system함수의 인자로 "/bin/sh"를 전달해 쉘을 따기
RTL x86 (32bit)
Calling Convention - __cdecl (C declaration) -
: 인텔 x86 기반 시스템의 C/C++에서 주로 사용하는 호출 규약
Linux kernel에서 기본적으로 Cdecl 호출 규약을 사용
▷ 인자 전달 방식
stack을 이용; 함수의 인자 값을 stack에 저장
▷ 인자 전달 순서
오른쪽 → 왼쪽의 순서로 stack에 쌓임
▷ 함수의 반환값
함수의 return 값 4byte 이하: EAX 레지스터에 저장
8byte 이하: 상위 4byte EDX + 하위 4byte EAX에 저장
▷ stack 정리
호출한 함수가 사용된 stack 공간을 정리; 호출한 함수가 호출된 함수의 stack frame 공간을 정리한다
(이유: c언어에는 가변인자 함수가 있어서 stack을 정리할 수 있는 정형화된 routine을 만들기 어려움)
RTL x64 (64bit)
Calling Convention - System V AMD64 ABI -
: Unix, Unix 계열 운영체제의 표준 호출규약
Solaris, Linux, FreeBSD, macOS에서 사용
▷ 인자 전달 방식
RDI, RSI, RDX, RCX, R8, R9: 정수 및 메모리 주소 인수 전달
XMM0, XMM1, ..., XMM7: 부동 소수점 인수 전달
▷ 인자 전달 순서
오른쪽 → 왼쪽의 순서로 레지스터에 저장
▷ 함수의 반환값
EAX 레지스터에 저장
▷ stack 정리
호출한 함수가 호출된 함수의 stack 공간 정리