본문 바로가기

system/writeup

nullcon hackim 2019 easy-shell

easy-shell

nullcon hackim 2019 easy-shell

sandox 관련 문제와 멀어져 있던 나를 다시 가까워지게 만들어준 고마운?! 문제이다.

대회 당시에는 풀지 못했어서 라업을 보고 다시 풀어본다.

 

init_arrayprctl이 걸려있다.

PR_SET_SECCOMP, SECCOMP_MODE_FILTERprctl이 걸려있으니 fprog를 디버깅 해보자.

 

seccomp 디버깅 관련해서 아주 좋은 툴을 david942j님이 개발해 두셨다.

https://github.com/david942j/seccomp-tools

 

strace로 바이너리를 실행시켜보면

위와 같이 prctl이 걸리는걸 확인할 수 있는데 이를 ptrace syscall을 이용하여 잡아내 disassemble 해주는 툴인가 보다. ( hooking인듯..? )

 

어쨋든 이를 이용하여 fprog bpf를 확인해 보면 위와 같다.

 

x86_64 arch여야 하며 execve가 막혀있다. ( blacklist )

 

mmap으로 rwx 섹터를 만들어 주고 여따 입력을 받는다.

입력을 받고 해당 공간을 가르키는 함수 포인터를 호출해주는데 문제는..

 

우리의 입력을 __ctype_b_loc 함수로 막아두고 있다. 특수문자 사용이 불가능하다.

즉, 쉘코드를 alphanumeric으로 짜야 한다.

 

근데 또, 문제는 syscall\x0f\x05라는 것이다. 이걸 어떻게 alphanumeric으로 짤까 생각하다가 졸려서 잠들었었다..

 

알게된 방법은, 미리 메모리에 alphanumeric 값을 써놓은 후 이를 xor하여 \x0f\x05로 바꾸는 것이다.

들어보지도 못했고 써보지도 못했던 기법이라 새 지식을 얻은 것 같아 좋다.

 

그렇게 syscall을 만든 후 push rax; pop rax를 통해 여분의 쉘 코드 공간을 만들어줬다.

그리고 read를 콜해서 쉘코드를 다시 쓰고나서 쉘코드의 처음 주소로 다시 뛰어 execveat("/bin//sh") 쉘코드로 쉘을 따는가 했지만

 

난생 처음보는 오류가 발생했다.

mmap 때문도 아니고 prctl 때문도 아니다.

대체 뭐가 문제인지 모르겠다.. 정말 궁금하다

 

일단 그래서 shellcraft를 이용하여 orw 쉘코드를 짜서 flag를 읽었다.

 

(임의로 만든 flag)


'system > writeup' 카테고리의 다른 글

2016 belluminar remuheap  (0) 2019.02.06
2014 31c3 mynx  (0) 2019.02.04
nullcon hackim 2019 tudutudututu  (0) 2019.02.03
nullcon hackim 2019 babypwn  (0) 2019.02.03
nullcon hackim 2019 hackim shop  (2) 2019.02.03