티스토리 뷰
이번에는 간단한 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 *a = malloc(10); char *b = 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 |
- oob
- pwnable.tw
- exit
- overflow
- codegate
- hacking
- FSB
- tcache
- TLS
- srop
- rt_sigreturn
- stack reusing
- heap
- pwnable
- pwable
- 해킹
- fastbindup
- glibc
- HackCTF
- ebp change
- shellcoding
- fastbin
- fsop
- SQLi
- 본선가고싶다
- Total
- Today
- Yesterday