ASLR이란? 주소 공간 배열 무작위화, 즉 실행할때마다 데이터 영역의 주소를 무작위화시켜서 직접적인 메모리 주소 참조가 힘들어진다. echo [NUM] > /proc/sys/kernel/randomize_va_space num = 0 : aslr 해제 num = 1 : 스택, 라이브러리 랜덤화 num = 2 : 스택, 라이브러리, 힙 랜덤화 예시 #include #include int main() { int stack; int *heap = (int*)malloc(3); printf("stack address : %p\n", &stack); printf("printf address : %p\n", printf); printf("heap address : %p\n", heap); return 0; } s..
RTL이란? Return To Library, 기존의 rts는 스택에 shellcode를 넣고 ret변조를 통해 셸을 실행시켰다. 하지만 Nx-bit 보호기법으로 스택에서 코드가 실행되지 않는다. 이를 우회하는 것이 RTL로 RET에 Library에 있는 함수의 주소를 넣어서 실행흐름을 변경한다. 공격순서(x86 기준) ret에 system함수의 주소를 넣는다. 그 후에는 system함수 이후 실행할 주소의 공간이니 아무 값으로 채운다, system 함수의 인자값을 입력한다. RTL chaining 가젯을 이용하여 이전의 인자들을 정리하고 ret부분에 다시 특정 함수를 호출한다. 그렇게 연속적으로 함수를 호출하는게 RTL chaining기법이다. x86 x86에서의 rtl chaining은 우선 가젯을 ..
우선 Lazy binding에 대해서 알아보자.Lazy binding이란?리눅스 ELF 바이너리에서 라이브러리 함수의 시작주소를 구하지 않다가, 함수를 처음 호출할 때 해당 주소를 구하는 것이다. 우선 링커에 대해 알아보자링커란?오브젝트 파일을 하나의 실행파일로 결합해주는 도구이다.링크의 과정예를 들어서 printf 함수를 사용한다고 하자.include 를 선언하고 printf를 사용컴파일일련의 과정을 거쳐 오브젝트 파일이 생성, 하지만 오브젝트파일은 아직 printf가 무엇인지 모름라이브러리의 printf의 구현 코드를 컴파일 한 오브젝트 파일을 기존 오브젝트 파일에 연결시킴실행파일 생성링크를 하는 방법에는 Static과 Dynamic 방식이 있다.Staticgcc 옵션중 static 옵션을 적용하면 ..
Stack Canary란? 스택에서 발생하는 BOF를 탐지하는 보호기법이다. BOF 자체를 막지는 못하지만 BOF가 발생했을 때 이를 탐지하여 프로그램을 종료시키는 방식으로 BOF 공격을 방지한다. 원리 우선 Stack Canary가 활성화 되어있을 경우 stack은 이런 식이다. Stack Canary는 지역변수 공간과 SFP 사이에 저장된다(rbp-0x08, 64비트 기준). Stack Canary가 적용했을 때 함수의 프롤로그는 기본적으로 이렇다. endbr64 push rbp mov rbp, rsp sub rsp, 0x30 mov rax, QWORD PTR fs:0x28 mov QWORD PTR [rbp-0x8], rax fs:0x28에는 Master Canary라 부르고 이 값을 rax에 저장하..
Buffer overflow란?버퍼가 허용할 수 있는 크기의 데이터를 넘어 더 많은 데이터를 입력 받아 버퍼가 넘치는 취약점이다. 대부분 입력값의 크기제한을 하지 않아서 발생을 한다. BOF가 발생하는 위치에 따라 Stack BOF, Heap BOF로 불린다.Stack Buffer overflow10크기의 A라는 배열과, B라는 배열을 만들었다고 하자.그리고 B배열 20의 크기의 데이터를 집어넣으면 오버플로우가 발생하며 남은 값들은 A배열에 저장된다.외부의 입력없이 일어날수도 있다. 10크기의 a배열과 b배열을 만들고 data의 배열을 만들고 20의 크기의 데이터를 집어넣는다. 그리고 data의 배열을 b배열에 복사한다. 그러면 overflow가 일어나서 남은 데이터들은 a배열에 저장된다.Heap Buf..
어셈블리어를 보고 c코드를 유추해서 만들어내는 것이다. 어셈블리는 위와 같다. 우선 canary 보호기법와 pie 보호기법을 해제해 줘야 한다. 핸드레이 결과는 아래와 같다. #include #include int get_int(){ char a[4]; scanf("%3s", a); return atoi(a); } int loop = 1; int main(){ char buf1[0x13] = "Simple handray ex!"; char *buf2 = "Hello, World"; int num; while(loop){ num = get_int(); switch(num) { case 1: puts(buf1); break; case 2: puts(buf2); break; case 3: loop = 0; d..
스택 프레임이란 함수 호출시 생성되는 지역 변수, 매개 변수, 복귀 주소 등의 정보를 저장하는 스택의 구조이다. ESP와 EBP를 이용하여 관리한다. 함수가 호출되면 call [함수] 가 실행되면 우선 PUSH EIP 를 한다. 이는 복귀하였을때 기존 실행될 명령어를 저장해 두는 것이다. 이 부분을 ret이라 한다. 프롤로그 PUSH EBP MOV EBP, ESP SUB ESP, x (이건 없을수도 있음) PUSH EBP : 함수가 종료되고 다시 이전 스택 프레임으로 복귀할 주소를 스택에 저장한다. 이 부분은 SFP라고 한다. MOV EBP, ESP : EBP에 ESP값을 넣어서 EBP를 현재 스택프레임의 EBP로 바꾼다. SUB ESP, x : ESP에서 x를 뺀다. 즉 스택 프레임의 데이터 저장 공간..
함수호출규약이란? 함수 호출 및 반환을 일관되고 효율적으로 처리하기 위해 정의한 규칙으로 인수를 전달하고 반환 값을 받는 방식, 레지스터 사용 규칙, 스택의 구성 등을 명시한다. 함수호출규약이 없다면? 프로세스가 종료되면 ESP는 함수 호출 전으로 돌아가고 스택 안에 남은 매개변수들은 지워지지 않고 이후 사용할 때 덮어씌워진다. 그러면 이후 계속 함수를 호출하면 결국 ESP가 스택의 끝에 위치하게 되고 그러면 더 이상 스택을 사용할 수 없으므로 ESP를 정리해야 한다. 환경 이름 매개변수 레지스터 스택정리 32bit cdecl 스택사용 Caller stdcall 스택사용 Callee fastcall ecx, edx Callee 64bit System V AMD64 ABI RDI, RSI, RDX, RCX..