![article thumbnail image](https://blog.kakaocdn.net/dn/CjDBH/btq4qEtasOV/krc22BSS2AEubjtc89Hki0/img.png)
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 |