background/linux

    [how2heap] House of Force (glibc 2.27)

    [how2heap] House of Force (glibc 2.27)

    House of Force는 top chunk size를 조작해 임의의 주소에 힙 청크를 할당하는 공격 기법이다. 탑 청크의 사이즈를 조작할 수 있어야 하고 원하는 크기의 malloc 요청을 할 수 있어야 한다. 오버라이트 하고자 하는 임의의 주소인 target address와 top chunk address를 알아야 한다. house of force는 glibc 2.29 버전에서 패치 되었다. 익스플로잇을 할 때 먼저 탑 청크의 사이즈를 표현할 수 있는 최대 값으로 조작한다. 이후 첫 번째 malloc으로 target 주소 - header size – 탑 청크 주소 – header size 만큼 요청해 target 주소 – header size까지 힙 청크를 할당한다. 이제 두 번째 malloc으로 한..

    Frame Pointer Overwirte (One Byte Overflow)

    Frame Pointer Overwirte (One Byte Overflow)

    Frame Pointer Overwirte는 하위 함수의 SFP 값 1바이트를 변조했을 때 2번의 에필로그 과정으로 RIP 레지스터를 컨트롤 할 수 있는 공격 기법이다. 공격의 특징은 다음과 같다. 메인 함수에서 호출된 하위 함수에서 SFP 값 중 1바이트를 변조할 수 있어야 한다. 변조한 SFP 값이 쉘 코드가 저장된 스택의 주소 - 4가 되어야 한다. 변조되기 전 SFP 값과 스택의 주소를 비교했을 때 하위 1.5바이트 이상 다르면 공격이 불가능하다. 익스플로잇 흐름은 다음과 같다. 스택의 주소를 구한 뒤 하위 함수의 SFP 값을 쉘 코드가 저장된 주소 - 4로 변조한다. 이후 에필로그 과정을 2번 거치면서 쉘 코드가 저장된 주소가 RIP 레지스터로 들어가 쉘 코드가 실행된다. 함수의 에필로그 먼저 ..

    return-to-csu x64 (RTC, JIT ROP)

    return-to-csu는 __libc_csu_init() 함수의 일부 코드를 Gadget으로 이용하는 기술이다. __libc_csu_init() 함수는 프로그램 실행 시 _init() 함수와 __preinit_array, __init_array 에 설정된 함수 포인터를 읽어서 함수를 호출한다. gdb-peda$ disassemble __libc_csu_init Dump of assembler code for function __libc_csu_init: 0x00000000004011a0 : endbr64 0x00000000004011a4 : push r15 0x00000000004011a6 : lea r15,[rip+0x2c63] # 0x403e10 0x00000000004011ad : push r14..

    [glibc-2.27] fwrite & fputs

    드림핵 강의를 보고 glibc-2.27을 분석한 글 입니다. (틀린 내용이 있을 수 있습니다) 파일에 데이터를 쓰기 위한 함수는 대표적으로 fwrite, fputs가 있다. 해당 함수는 라이브러리 내부에서 _IO_sputn 함수를 호출한다. 해당 함수는 _IO_XSPUTN 함수의 매크로이며 실질적으로 _IO_new_file_xsputn 함수를 실행한다. 이 함수에서는 파일 함수로 전달된 인자인 데이터와 길이를 검사하고 _IO_OVERFLOW(_IO_new_file_overflow) 함수를 호출한다. 실제 파일에 내용을 쓰는 과정은 _IO_new_file_overflow를 시작으로 다양한 함수가 호출되면서 이루어진다. fwrite fwrite 함수는 _IO_fwrite 함수의 다른 이름이며 iofwrite..

    [glibc-2.27] fread & fgets

    드림핵 강의를 보고 glibc-2.27을 분석한 글 입니다. (틀린 내용이 있을 수 있습니다) 파일의 내용을 읽기 위한 함수는 대표적으로 fread, fgets가 있다. 해당 함수는 라이브러리 내부에서 _IO_file_xsgetn 함수를 호출한다. 실제 파일의 내용을 읽는 과정은 _IO_new_file_underflow를 시작으로 다양한 함수가 호출되면서 이루어진다. fread fread 함수는 _IO_fread의 별칭으로 iofread.c 에 정의되어 있다. _IO_size_t _IO_fread (void *buf, _IO_size_t size, _IO_size_t count, _IO_FILE *fp) { _IO_size_t bytes_requested = size * count; _IO_size_t ..