profile image

L o a d i n g . . .

Heap Overflow

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    FILE* fd = fopen("secret","r");
    char* input = malloc(40);
    char* secret = malloc(40);
 
    fread(secret, 1, 40, fd);
    fclose(fd);
 
    read(0, input, 100);  // Overflow!
    printf("%s\n", input);
}

두 개의 heap 메모리인 input 과 secret 을 할당한 뒤, secret 파일을 읽어서 두번째로 할당했던 secret 영역에 저장한다.

그 후 input 영역에 입력 값을 받고 출력시켜주는 코드이다.

 

이때 read 함수에서 취약점이 터진다. input 으로 할당한 메모리 크기는 40 바이트인 반면 read 함수를 통해 100바이트까지 입력할 수 있어 Heap Overflow 가 발생한다.

 

printf 함수로 문자열을 출력할 때는 널 바이트를 만날 때까지 출력한다.

 

-> Heap overflow 를 이용해 secret에 할당된 메모리 영역 직전까지 채워주면, 문자열이 연결되서 printf 함수가 secret 메모리의 값까지 출력할 것이다.

 

처음에 input, secret의 offset 을 40으로 보고 엔터가 들어가는 것을 고려해서 39만큼 문자열을 입력해주면 익스가 되지 않는다.

 

앞에 있는 메타 데이터를 고려하지 않았기 때문인데, 메타데이터 8바이트까지 고려해서 47바이트 길이의 문자열을 입력하면 익스가 된다.

 

 

 

참고
https://bpsecblog.wordpress.com/2016/10/06/heap_vuln/

'Hacking > Pwnable' 카테고리의 다른 글

[Heap exploitation] Fastbin dup  (0) 2021.05.11
[Heap exploitation] Use After Free  (0) 2021.05.11
[Pwnable] Heap3  (0) 2021.05.06
[Pwnable] Heap2  (0) 2021.05.05
[Pwnable] Heap1  (0) 2021.05.05
복사했습니다!