RELRO란? Relocation Read-Only elf 바이너리 프로세스의 데이터 섹션의 메모리가 변경되는 것을 보호하는 기법이다. 크게 3가지가 있다. NO RELRO, Partial RELRO, FULL RELRO NO RELRO ELF의 기본헤더, 코드 영역을 제외한 거의 모든 부분에 Read, Write 권한을 주는 것이다. 거의 모든 부분을 읽고 쓰고 할 수 있으니 보안에 매우 취약하다. 파란선 아래로 쓰기가 가능하다. .fini_array overwrite, got overwrite 이 가능하다. Partial RELRO 몇몇 부분에 쓰기권한이 없어졌다. 파란선 아래로 쓰기가 가능하다. .fini_array overwrite는 불가능하다. got overwrite는 가능하다. 참고로 got..
위치독립실행, 바이너리 주소 랜덤화 즉 메모리상의 명렁어들의 위치가 매번 바뀐다. ASLR이 코드 영역에도 적용되게 해주는 기술이라고 볼 수 있다. 이때 ASLR이 0이면 PIE를 적용해도 주소랜덤화는 작동을 하지 않는다. ASLR이 1이면 PIE를 적용했을 때 전체 주소가 랜덤화된다. (2일때도 마찬가지) 예 #include int hello(){ printf("hello"); return 0; } int x; int y = 10; int main(){ int a; int *b = (int_)malloc(10); printf("code : %p\n", hello); printf("Data : %p\n", &y); printf("BSS : %p\n", &x); printf("heap : %p\n", b)..
one gadget조건이 충족되면 한번에 셸을 따버리는 가젯이다.분석리눅스 명령어 strings를 이용해서 libc.so.6 파일에서 /bin/sh 문자열을 찾아낸다.그리고 objdump로 /bin/sh 가 들어간 곳을 모두 찾아낸 후 근처에 execve 함수가 있는 곳을 찾아본다.이런식으로 one gadget을 찾을 수 있다.그리고 이것을 one shot gadget 툴을 이용해서 쉽게 찾을 수 있다.이는offset 값 함수의 형태constraints:조건와 같은 형태를 지닌다.예를 들어서 이 부분에 해당하는 부분을 보면 아래와 같다.조건이 충족되면 execve(”/bin/sh”, rsp+0x30, environ) 라는 함수가 실행이된다. 그리고 그 조건으로는 rsp+0x30부분이 null이면 된다. ..
PLT 외부 프로시저를 연결해주는 테이블, PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다. GOT PLT가 참조하는 테이블, 프로시저들의 주소가 들어있다. 처음 호출 함수 호출 -> PLT 이동 -> GOT 참조(null) -> dl_resolve 함수 실행 -> GOT에 함수 주소 쓰여짐 -> 해당 함수로 점프 처음 이후의 호출 함수 호출 -> PLT 이동 -> GOT 참조(주소 존재) -> 해당 함수로 점프 debugging 처음 printf를 실행한다. printf_got 로 jump 한다. _dl_runtime_resolve_xsavec 실행 한 번 실행 후에는 got에 실제 주소가 쓰여 있다.
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에 저장하..