BackGround : Calling Convention
- 학습 목표
- cdecl, SYSV 호출 규약이 무엇인지, 그리고 다음 코스에서 배우는 스택 버퍼 오버플로우가 왜 위험한지 이해할 수 있다.
- 서론 : 함수 호출 규약
- 함수의 호출 및 반환에 대한 약속
- 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장
- 호출자는 피호출자(Callee)가 요구하는 인자를 전달
- 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 함
- 종류
- x86
- cdecl
- stdcall
- fastcall
- thiscall
- x86-64
- System V AMD64 ABI - Calling Convention
- MS ABI - Calling Convention
- x86 호출 규약 - cdecl
- 특징
- 스택을 통해 인자를 전달
- 마지막 인자부터 첫 번째 인자까지 거꾸로 스택에 push
- 인자를 전달하기 위해 사용한 스택을 호출자가 정리
- SYSV - 리눅스는 SYSV ABI 기반
- SYStem V (SYSV) Application Binary Interface (ABI)
- ELF format
- Linking method
- calling convention, etc...
- Features of Calling Convention in SYSV
- 6개 인자 - RDI, RSI, RDX, RCX, R8, R9에 순서대로 전달
- Caller에서 인자 전달에 사용된 스택 정리
- 함수 반환 값은 RAX로 전달
Background - main함수의 매개변수 2개
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
printf("argc : %d\n",argc);
for(int i=0;i<argc;i++)
{
printf("argv[%d] : %s\n",i,argv[i]);
}
exit(0);
}
- int argc : 메인함수에 전달되는 정보의 갯수
- char* argv[ ] : 메인함수에 전달되는 실질적 정보
- argv[0] = "C:\dir" 또는 "/dir" (실행경로)
- argv[1], .... : 문자열 단위 데이터 (공백기준)
- 숫자도 문자열형태로 들어와서 변환 필요
Main : Stack Buffer Overflow
-
스택 버퍼 오버플로우를 이해하고, 이로 인해 발생할 수 있는 보안상의 위협을 안다.
-
서론
- Stack Overflow vs Stack Buffer Overflow...?
- 전자는 스택영역이 너무 많이 확장되어 발생한 버그
- 후자는 스택의 버퍼에 지정 크기보다 많은 데이터가 입력되어 발생하는 버그
-
버퍼 오버플로우
-
스택의 버퍼에서 발생하는 오버플로우
- 버퍼 : 데이터 임시 저장소 - 유실 방지, 간접적 data 전달
- 송신 - 버퍼로 전송, 수신 - 버퍼에서 꺼냄 (완충작용)
- 스택의 지역변수 - 스택 버퍼, 힙 할당 메모리 - 힙 버퍼
- 메모리 상에 연속적으로 할당됨 - 오버플로우 발생 시 뒤 버퍼 값 조작될 위험 존재 - 보안 위협
- ex : 10B 버퍼에 20B 크기 데이터가 들어가려 하면 발생
-
데이터 변조 : 입력을 제한하지 않으면 해당 버퍼 뒤의 다른 버퍼의 값까지 바꿀 수 있음
-
데이터 유출 : char temp[16]을 선언하고 버퍼에 오버플로우를 발생시켜 다른 버퍼 사이 null바이트를 모두 제거하면 그 다른 버퍼까지 출력시켜서 그 버퍼의 데이터까지도 뽑아낼 수 있음
-
실행 흐름 조작 : sbof로 함수의 반환 주소를 조작하면 프로세스의 실행 흐름을 바꿀 수 있음