일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- cmake
- HOS
- PLT
- pwndbg
- windows
- randtbl
- SCP
- windows kernel
- return to libraty
- patchelf
- frida-dump
- house of force
- kernel debug
- JOP
- elf 헤더
- RAO
- fastbin
- 계산기
- ntwritefile
- sgerrand
- canary leak
- libc-database
- WinDBG
- dangling pointer
- Android
- top chunk
- libc.so
- ioploaddrivers
- kaslr
- brop
- Today
- Total
목록Study/Linux (11)
sh711 님의 블로그

1. BROP (Blind Return-Oriented Programming)BROP란 ROP 기법을 사용하여 프로그램을 제어하는 과정에서 바이너리파일과 소스코드가 존재 하지 않을 때 (바이너리가 공개되지 않은 오픈 소스 등) 사용할 수 있는 기법이다.Blind Sql Injection과 비슷하게 프로그램의 반응을 보며 특정 주소의 정보를 수집하고 정보를 통해 흐름을 제어한다. 필요 순서1. 리턴 값 변조가 가능한 부분을 찾고 카나리 값 유출2. Stop Gadget 찾기3. Stop Gadget를 이용해 레지스터에 값을 저장할 수 있는 BROP Gadget 찾기4. 필요한 함수 찾기5. ROP 수행 Stop Gadget 이란BROP Gadget을 찾기 위한 가젯으로 프로그램 재시작 및 취약한 함수의 시..

1. JOPJOP 기법은 JUMP 명령을 통해 프로그램 흐름을 제어하는 기법이다ROP 방식과 비슷한 방식이지만 jmp를 통해 흐름을 조작한다는 차이가 있다 2. 실습실습 코드#define _GNU_SOURCE#include #include #include void init() { setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0);}void vuln(){ char buf[50]; void (*printf_addr)() = dlsym(RTLD_NEXT, "printf"); printf("Printf() address : %p\n",printf_addr); read(0, buf, 256);} void m..

1. Dangling PointerDangling Pointer란, 할당된 메모리가 free 이후에도 해제된 메모리를 계속 가리키는 포인터를 의미한다.따라서, 프로그램 개발 시 해당 포인터를 NULL 값으로 초기화하지 않는 경우 UAF 등의 버그가 발생할 수 있으며 이를 통해 노출되지 말아야할 정보가 노출되거나 DFB를 통한 임의 주소 메모리 할당 등의 행위가 가능해진다. 2. 예제 코드코드 내에서 #include #include int main() { int *ptr = (int *)malloc(sizeof(int)); *ptr = 42; printf("Before Free : *ptr = %d\n", *ptr); free(ptr); pr..
1. house of spirithos 취약점은 fastbin free 시 임의의 주소를 free 시킨 후 동일 사이즈 재할당 시 해당 메모리 주소가 할당되는 취약점이다.glibc-2.32 부터 보안 패치가 되었고 테스트 환경은 glibc-2.27에서 진행하였다. 2. 코드 분석static void_int_free (mstate av, mchunkptr p, int have_lock){ INTERNAL_SIZE_T size; /* its size */ mfastbinptr *fb; /* associated fastbin */ mchunkptr nextchunk; /* next contiguous chunk */ INTERNAL_SIZE_T nexts..

1. house of force top_chunk의 size를 변조하여 소스 코드 내 검증 로직 우회를 통해 top_chunk를 임의의 위치로 업데이트 시킨 후해당 주소에 메모리 할당을 받을 수 있는 취약점이다. glibc-2.29 이상에선 패치가 되었고 테스트 환경은 glibc-2.27에서 진행하였다. 2. 코드 분석아래 코드가 실제 malloc 시 동적 메모리 할당을 해주는 부분이다 // glibc-2.27/malloc/malloc.c:2728 /* finally, do the allocation */ p = av->top; size = chunksize (p); /* check that one of the above allocation paths succeeded */ if ((uns..

1. Kernel커널은 운영체제에서 가장 핵심적인 부분으로 하드웨어와 직접적인 상호작용을한다.시스템 소프트웨어 면에서 가장 낮은 단계이며 여러 기능들도 수행한다.프로세스 관리새로운 프로세스 생성 (fork, execve)프로세스 종료 및 정리프로세스 스케줄링컨텍스트 스위칭 등 메모리 관리가상 메모리 관리메모리 할당 (malloc)페이지 테이블을 이용한 주소 변환 시스템 호출 처리유저 모드 프로세스가 커널 기능을 사용하도록 인터페이스 제공 (syscall) 파일 시스템 관리파일 및 디렉터리 생성파일 시스템 형식 지원 (ext4, NTFS, FAT32 등) 이 외에도 다양한 기능을 실질적으로 수행하는 곳이 커널 영역이다.Return to Shellcode 2. KASLR (Kernel Address Spac..

1. randrand 함수는 C에서 난수를 생성해주는 함수로 stdlib.h 헤더 파일에 정의되어 있다.그러나, 일반적으로 rand 만 사용 시 반환되는 난수는 일정할 수 있다.이유는 고정된 시드(seed) 값에서 난수가 생성되기 때문이다. 2. srandsrand() 함수는 난수 생성시 사용되는 randtbl 배열을 인자인 seed 값에 따라 초기화 시킨다srand 호출 이후 rand 에서 반환되는 값은 일정하지 않다.하지만, 일반적으로 srand(seed)를 수행할 때 seed 값이 고정되 있을 경우 마찬가지로 rand 함수는 같은 난수를 반환한다.이 때문에 보통 time() 함수의 결과를 seed로 사용하는 경우가 많다. 3. srand 분석rand 값 생성 과정을 분석하기 위한 예제 코드이다 =>..

1. 개념House of Force는 glibc의 malloc을 이용한 힙 오버플로우 공격 기법으로, top chunk(최상단 청크)를 제어하여 공격자가 원하는 메모리 주소를 할당할 수 있도록 조작하는 기법이다 tcache(Thread Cache) 도입 glibc 2.26부터 tcache가 도입되어 작은 크기의 할당 요청은 tcache에서 처리됨. 즉, 일반적인 할당 요청이 top chunk를 직접 사용하지 않게 됨 → House of Force를 수행하기 어려움 top chunk 확장 방식 개선 malloc()을 호출할 때 top chunk를 확장하는 과정에서, 보안 체크가 추가됨. 예전 버전(glibc 2.23)에서는 top chunk의 크기를 과하게 키워도 제어가 가능했으나,..

1. ELF 파일ELF(Executable and Linkable File) 파일이란 리눅스 및 유닉스 계열 운영체제에서 실행 파일, 오브젝트 파일, 공유 라이브러리 및 코어 덤프 파일을 위한 표준 포멧이다.ELF 파일은 크게 다음과 같은 구조로 이루어져 있다.ELF Header => 파일의 전체적인 정보를 담고 있음Program Header => 실행 가능한 세그먼트 정보 (실행 파일에 존재)Section Header => 개별 섹션 정보 (오브젝트 파일에 존재)Segment Data => 실제 프로그램 코드 및 데이터Section Data => 개별 섹션 데이터 (.text, .data, .bss 등)이 중에 ELF Header는 파일의 가장 첫 부분에 위치하며, 파일의 전체적인 구조 및 속성을 나타..

📌 1. 개념1.1 컴파일컴파일이란 아래와 같이 작성된 고급 언어(C언어)를 실행 가능한 포멧으로 변환하는 과정이다.컴파일에는 동적 컴파일과 정적 컴파일 방식이 있다.// main.c#include #include int main() { printf("stdout : %p\n", stdout); char buffer[0x40]; read(0, buffer, 0x80); return 0;} 1.1.1 동적 컴파일일반적으로 동적 컴파일을 통해 printf, scanf 와 같은 외부 함수는 라이브러리 (리눅스의 경우 libc.so)를 참조하여 사용된다.함수 원형 코드를 프로그램 자체에 포함하지 않기 때문에 파일의 크기가 크지 않은 장점이 있지만 프로그램을 실..