티스토리 뷰

pwnable/정리

heap overflow

ba0bab 2018. 7. 25. 16:11


이번에는 간단한 heap overflow에 대해서 글을 써볼려고 한다.


heap overflow는 stack overflow와 같이 입력을 과다하게 해 넘치게 하는 것 이다.


다만 다른 점은, heap chunk에는 다양한 값들이 data와 함께 들어가기 때문에 overflow 할 시 조금 더 생각을 해줘야 한다.


다음은 내가 짠 코드이다.


>> heapover.c


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
int main(){
    
    char *= malloc(10);
    char *= malloc(10);     
    printf("%p\n", a);    
    printf("%p\n", b);
    
    strcpy(b, "secret!");    
    read(0, a, 100);
    printf("%s", a);
    
    return 0;
}
cs


위 코드는 간단한 코드이다. 


a 와 b를 10씩 malloc 해준다.


동적할당 된 a와 b의 주소를 printf 해준다. 이는 overflow할 때 위치를 계산하기 위해서 작성하였다.


동적할당 된 b에는 secret!이라는 message가 담겨있고


read함수로 a에 입력을 받는다. 


그리고 a를 출력해준다.


여기서 우리가 목표하는 것은 입력을 얼마만큼 overflow를 시켜 secret! 매세지를 leak하는 것 이다.


>>참고로 먼저 선언 된 변수의 주소가 더 낮은 주소를 갖는다. 따라서 메모리 구조는  | a | b | 가 된다. 이는 스택과 같다.


스택에서

char a[10];

char b[10];


이렇게 선언 되어있으면 그냥 a*10을 하면 leak 할 수 있을 것이다.


하지만 힙이라면? 


일단 프로그램을 시켜보자.



실행을 시켜보니 a와 b의 주소를 알려준다. 주소를 알려주니 offset을 구할 수 있을 것이다.


b - a = 32이다. a주소와 b주소 사이의 거리는 32이다.


그렇다면 이제 overflow를 시켜 b의 매세지를 leak해보겠다.


offset이 32이지만 Enter(\x0a)를 생각해서 31byte만큼만 입력 해보겠다.



secret 메세지가 출력되었다.


stack과 heap에서의 overflow가 다르다는 점을 알 수 있다.


그렇다면 32byte의 offset만큼에 어떤 값이 들어갈까?


그 구조는 나중에 쓰겠다..


그리고 stack overflow 를 통해 보통 return address 를 조작하여 프로그램의 흐름을 조작할 수 있었다면


heap overflow는 함수 포인터를 조작하여 조작 할 수 있다.



'pwnable > 정리' 카테고리의 다른 글

pwntools stdin, stdout offset 구하기  (0) 2018.07.29
heap chunk 구조 분석  (1) 2018.07.27
heap exploit 공부  (0) 2018.07.25
heap2.c  (0) 2018.07.25
fist fit, malloc, free  (0) 2018.07.25
Comments