Hacking/Pwn

힙을 gdb로 살펴보자!

알 수 없는 사용자 2017. 10. 2. 17:12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    char *buf = (char *)malloc(256);
    char *buf1 = (char*)malloc(512);
 
    strcpy(buf, argv[1]);
    strcpy(buf1, argv[2]);
    printf("%s\n", buf);
    free(buf);
    free(buf1);
}
 
cs


일단 오늘 분석해볼 코드이다!


(출처: s0ngsari.tistory.com)


이 코드를 하나하나 gdb로 분석해보면서 malloc과 free가 어떤식으로 힙으로 저장되는지 그 과정을 살펴볼것임!


http://tribal1012.tistory.com/78 < 이 글과 같이보면 좋아요!




먼저 첫번째 malloc에 브레이크를 걸고 힙영역을 살펴볼것이다.




보면 size of chunk가 나와있다


왜우리는 0x100을 할당했는데 size가 0x111이냐 하고 한다면



할당했을떄 나오는 청크이다. (Allocated Chunk)


prev_size (8) + chunk_size (8) + user data (256) + null (1) = 273 (0x111)
이 된다! (64bit) 기준




두번쨰 malloc에 브레이크를 걸고 실행한 결과인데, 0x211에는 원래 top chunk가 있던자리였는데 두번쨰 malloc을 할당한 크기가 저장되어있다!


그리고 두번쨰 free까지 다하고 브레이크를 걸면 chunk_size 뒤에 이상한 값이 들어있는데 이건 fd와 bk라고 한다!



fd - forward pointer

bk - backward pointer


이 fd와 bk를 살펴보면 아주 신기한게 들어있다



오 fd+8 를 살펴보니까 top chunk가 저장되어있다!