ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Heap with GDB!
    Hack/Pwnable 2016. 9. 15. 16:34

    요즘 대회때 heap에 대한 문제가 넘나 많아서 힙에대한 지식좀 제대로 쌓아야겠다


    공부한 내용이라 잘못된거 있으면 지적좀 해주세요 달게받겠습니다!


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #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

    댓글

Designed by Tistory.