-
Heap with GDB!Hack/Pwnable 2016. 9. 15. 16:34
요즘 대회때 heap에 대한 문제가 넘나 많아서 힙에대한 지식좀 제대로 쌓아야겠다
공부한 내용이라 잘못된거 있으면 지적좀 해주세요 달게받겠습니다!
123456789101112#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 buf, buf1에 각각 256바이트와 512바이트를 할당하고 buf = argv[1], buf1 = argv[2]를 각각 받고 free를 해주는 간단한 코드당malloc을 하면 어떻게 힙에 할당되는지, free를 하고나서 어떤 구조를 갖고있는지를 확인하기위해 공부를 했당자세한 정보는 아래 링크에서 확인이 가능!https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/첫번쨰 malloc해주는곳에다 bp 걸고 힙 상황을 확인해봐야겠다.
movl $0x100, %(esp) 를 봐선 256바이트를 확인하는것을 알 수 있다!
(gdb) b *0x080484c2
Breakpoint 1 at 0x80484c2
자 실행해보면 eax에 할당된 힙주소+8이 기록된다
깔쌈하게 잘나오넹
자 우선, 여기에 나오는건 buf의 heap 영역인것부터 알아둬야하고, 두번째 malloc은 할당되지않은 상태이다!
malloc이 되면 prev_size 와 size of chunk로 시작하게되는데, 사진상으로 나타낸다면 아래와같다
0x804b000 -> prev_size
0x804b004 -> size of chunk
0x804b008 -> user data
. . .
0x804b10c -> top chunk
이렇게 된다는걸 알아두면된다.
size of chunk를보면 0x109가 할당되어있는데 10진수로 265인데, 우린 분명 256바이트를 할당했다. 근데 왜 size of chunk가 265지 킁킁;
prev_size,(4) size of chunk(4) + userdata(256) + null(1) = 265
이렇게 265바이트가 된다. 자 두번쨰 malloc을 해보도록 하자
두번째 malloc(512)가 호출되었다. 힙 영역을 확인해봐야겠당
오메 이게뭐시여!! 첫번쨰 영역의 top chunk였던곳이 malloc을통해 512바이트가 할당되니 탑청크자리에 size of chunk가 자리잡았다.
계산해보면 0x804b000 + 268 + 520 하면 딱 탑청크가 있겠네용
(gdb) x/1000x 0x804b000 + 268 + 520
0x804b314: 0x00020cf1 0x00000000 0x00000000 0x00000000
ㅎㅇ top chunk~!
잡담은 그만하고 일단 아래와 같이 됬당
[buf]
prev_chunk
size of chunk
userdata
[buf1]
prev_chunk
sizeofchunk
userdata
top_chunk
그리고 전 topchunk와 비교해보면 520바이트가 늘어난상태로 배치되있다. (이건 당연한소리)
위에 언급했듯이 strcpy가 call된후에 userdata가 들어갔다.
호옹이~ 이제 free한후에 결과를 봅시당
0x804b008부터 보면 이상한값이 들어가있다. 저것은 free될때의 fd와 bk 라고 한다.
fd - forward pointer
bk - backward pointer
각각은 next chunk와 prev chunk를 가리키는 포인터이다.
free 한번 되고나선 topchunk 바로앞을 가리키고있다.
(gdb) x/x *0xf7fbc450+4
0x804b314: 0x00020cf1
두번째 free를 호출하고나서의 힙을 확인해보자
눈으로 보이는것은 size of chunk가 0x00021001로 셋팅되어있다 (왜저런지는 아직 의문)
그리고 fd와 bk는 buf의 prev_size를 나타내고있다
(gdb) x/x 0xf7fbc450
0xf7fbc450: 0x0804b000
그리고는 프로그램이 끝나게된다
gdb로 malloc과 free의 과정을 지켜보았는데 확실히 이해가 잘된다.
문서만 보는거보다 직접 까보는게 나을듯...
따라하면서 해보세요 @@
'Hack > Pwnable' 카테고리의 다른 글
ringzer0 pwnx64 (0) 2016.10.02 Use-After-Free GOT Overwrite (2) 2016.10.02 first_fit use after free (0) 2016.09.13 fast_dup double free attack (0) 2016.09.13 Layer CTF easy_bof (2) 2016.09.05