GNU obstack function-pointer hijack
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
개요
GNU obstacks는 할당자 상태를 두 개의 간접 호출 대상과 함께 포함합니다:
chunkfun(offset+0x38) with signaturevoid *(*chunkfun)(void *, size_t)freefun(offset+0x40) with signaturevoid (*freefun)(void *, void *)extra_arg와use_extra_arg플래그는_obstack_newchunk가chunkfun(new_size)또는chunkfun(extra_arg, new_size)중 어떤 형태로 호출될지 선택합니다
공격자가 애플리케이션 소유의 struct obstack * 또는 그 필드를 손상시킬 수 있다면, obstack이 다음 번 확장될 때(next_free == chunk_limit), chunkfun을 통한 간접 호출이 발생하여 코드 실행 프리미티브를 가능하게 합니다.
Primitive: size_t 불일치 → 0-바이트 할당 → 포인터 OOB 쓰기
일반적인 버그 패턴은 32-bit register를 사용해 sizeof(ptr) * count를 계산하는 반면 논리적 길이는 64-bit size_t에 저장하는 것입니다.
- Example:
elements = obstack_alloc(obs, sizeof(void *) * size);is compiled asSHL EAX,0x3forsize << 3. size = 0x20000000및sizeof(void *) = 8일 때, 32-bit에서 곱셈이0x0으로 래핑되어 포인터 배열이 0 바이트가 되지만, 기록된size는 여전히0x20000000입니다.- 이후
elements[curr++] = ptr;쓰기는 인접한 힙 객체들에 8-바이트 OOB 포인터 저장을 수행하여 제어 가능한 객체 간 덮어쓰기 프리미티브를 제공합니다.
Leaking libc via obstack.chunkfun
- 두 힙 객체를 인접하게 배치합니다(예: 별개의 obstacks로 구성된 두 스택).
- 객체 A의 포인터 배열 OOB 쓰기를 사용해 객체 B의
elements포인터를 덮어써서, B에서의pop/read가 객체 A의 obstack 내부 주소를 역참조하도록 만듭니다. - 오프셋
0x38에서chunkfun(malloc이 기본값)을 읽어 libc 함수 포인터를 노출시키고, 그 다음libc_base = leak - malloc_offset을 계산하여 다른 심볼(예:system,"/bin/sh")을 유도합니다.
Hijacking chunkfun with a fake obstack
피해자의 저장된 struct obstack *을 덮어써서 obstack 헤더를 흉내낸 공격자가 제어하는 데이터로 가리키게 만듭니다. 최소한 필요한 필드:
next_free == chunk_limit— 다음 push에서_obstack_newchunk를 강제하기 위해chunkfun = system_addrextra_arg = binsh_addr,use_extra_arg = 1— 두-인자 호출 형태 선택
그런 다음 피해자 obstack에서 할당을 트리거하여 간접 호출을 통해 system("/bin/sh")을 실행합니다.
Example fake obstack layout (glibc 2.42 offsets):
fake = b""
fake += p64(0x1000) # chunk_size
fake += p64(heap_leak) # chunk
fake += p64(heap_leak) # object_base
fake += p64(heap_leak) # next_free == chunk_limit
fake += p64(heap_leak) # chunk_limit
fake += p64(0xF) # alignment_mask
fake += p64(0) # temp
fake += p64(system_addr) # chunkfun
fake += p64(0) # freefun
fake += p64(binsh_addr) # extra_arg
fake += p64(1) # use_extra_arg flag set
공격 절차
- Trigger size wrap로 거대한 논리적 길이를 가진 0-byte pointer array를 생성합니다.
- Groom adjacency하여 OOB pointer store가 obstack pointer를 포함하는 인접 객체에 도달하도록 조작합니다.
- Leak libc — victim pointer를 neighbor obstack의
chunkfun으로 리다이렉트하고 function pointer를 읽습니다. - Forge obstack 데이터에 제어된
chunkfun/extra_arg를 넣고_obstack_newchunk가 위조된 헤더에 오도록 강제하여 공격자가 선택한 function-pointer 호출을 발생시킵니다.
References
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.


