일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dangling pointer
- kaslr
- ntwritefile
- elf 헤더
- randtbl
- Android
- WinDBG
- 계산기
- SCP
- HOS
- fastbin
- RAO
- windows
- cmake
- windows kernel
- top chunk
- return to libraty
- libc.so
- pwndbg
- sgerrand
- brop
- ioploaddrivers
- PLT
- frida-dump
- libc-database
- house of force
- patchelf
- canary leak
- kernel debug
- JOP
- Today
- Total
목록분류 전체보기 (24)
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 값 생성 과정을 분석하기 위한 예제 코드이다 =>..

라이브러리 변경 patchelf --replace-needed libc.so.6 [변경 라이브러리 경로] [파일명] ld 변경patchelf --set-interpreter [ld 경로] [파일명] 로컬에서 glibc 빌드 시 ld버전 등의 문제로 원활하게 빌드가 불가능하다아래 링크 도커 이미지를 통해 손쉽게 원하는 glibc 버전 환경 구성이 가능하다https://github.com/sgerrand/docker-glibc-builder GitHub - sgerrand/docker-glibc-builder: A glibc binary package builder in DockerA glibc binary package builder in Docker. Contribute to sgerrand/doc..

윈도우 부팅 과정 드라이버 로드 과정 확인을 위해 nt!IopInitializeBootDrivers 함수에 bp를 설정했다 이어서, nt!IopLoadDriver 함수에 브레이크 설정 후 Go 하면 브레이크가 잡힌다 IopLoadDriver 함수는 로드할 드라이버의 경로, 각 드라이버에 존재하는 DRIVER_OBJECT를 인자로 받는다// IopLoadDriver 함수 원형NTSTATUS IopLoadDriver( IN PUNICODE_STRING DriverName, IN PDRIVER_OBJECT *DriverObject); 인자인 rcx, rdx 의 값 확인 시 현재 확인이 불가하다 이어서, nt!MmLoadSystemImageEx 함수에 브레이크를 걸고 진행시킨다 이제 드라이버 내 Dr..

1. 개념windows API 프로그래밍은 윈도우 환경에서 작동되는 프로그래밍 개발 방식으로 윈도우의 자체적인 API를 사용하는 프로그래밍이다 2. 실습간단한 창을 띄우는 프로그램을 만들어보겠다.프로그램에 사용될 Window API 함수들에 대해 살펴보자 2-2. CreateWindowExA해당 함수는 창을 만들어주는 함수로 크기, 스타일 등을 매개변수로 받아 호출된다.// 함수 원형HWND CreateWindowExA( [in] DWORD dwExStyle, // 만들 창의 확장 창 스타일 [in, optional] LPCSTR lpClassName, // 창 클래스 이름 [in, optional] LPCSTR lpWindowName, // 창 이름 [in]..