티스토리 뷰

CTF write-up

Secuinside CTF cgc cykor2

marshimaro aSiagaming 2017. 7. 5. 23:41


cgc라는 영역에 흥미가 생겨서 조금씩 공부를 해볼려 한다.

SECUINSDIE CTF 2016에 나왔던 cykor_00002라는 문제이다.


cgc파일은 일반적인 unix환경에서는 동작하지 않으며, file 명령어를 통해 볼려해도 data라고만 나오는데

식별불가능한 헤더를 가지고있어서 그렇다.


vagrant라는 것을 통해 cgc를 구동할 수 있는 환경을 만들어주어야 한다.

또한 서버에 PoV( Proof of Vuln )을 xml로 전송해주어야 하는데, 현재는 서버가 닫혀있어서 플래그를 보지는 못한다.






바이너리를 동작시켜보면 일단 name을 받아주고 어떤 메세지를 입력받고 끝난다.

SIGSEGV는 보통은 입력버퍼의 문제에서 발생하니까 입력받는 어딘가가 취약할 가능성이 높다.

일단 바이너리를 분석해보자.






보면 알 수 있다싶이 아주 직관적이다.

input으로 넣어준 name이 ADMIN이냐 아니냐가 분기가 달라진다.





ADMIN으로 입력값을 주게되면 KEY를 달라고한다.

그럼 이 KEY는 어떤 값을 줘야할까?






Welcome으로 가는 분기문 전에 어떤 연산을 통해 

리턴 값을 검증하며 분기를 한다.

임의로 z3_solver라고 이름은 지어주었는데 저 함수 내부를 분석해보면 왜 그렇게 지었는지 알 수 있다.









해당 함수내부에는 저런식으로 bss섹션에 전역변수가 25개있는데

25개의 변수에 대한 25개의 덧셈식이 존재한다.

이 변수의 값을 알아낼려면 사람의 연산으로는 사실상 매우매우 힘이든다.






위에서 말한 리턴 값을 받게 정상적으로 리턴하게 된다.

Python z3 module을 이용하여 간단하게 script를 짜주면 된다.



solve_cykor2.py


돌려주면 위와같은 key값이 나오게된다.


참고로 순서대로 1~25를 ascii값으로 변경해주면 이상한 값이 나온다.

왜냐하면 참조하는 메모리영역이 다음과 같은 순서이기 때문에 이 순서로 맞춰주어야 한다.






그러면 이 key값으로 넣어줘보자.






다른 입력 값을 처음처럼 받는 것 같다.

조금 더 분석해보자.





입력 값이 C와 K인지를 검증하는데

그렇게 되면 후에 mov byte [eax], 0xa에서 Null pointer Dereference로인해 SIGSEGV가 터지는 것 같다. 







이후에는 아마 이 Crash나는 지점을 바탕으로 xml코드를 짜서 서버로 보내주는게 아닌가 싶다.






댓글
  • 프로필사진 tonix0114 바이너리 닌자 쓰시는거 같은데 아이다랑 비교 했을때 좋은점이 있나요? 2017.07.06 12:49
  • 프로필사진 marshimaro aSiagaming IDA가 훨씬 좋죠..... 바이너리 닌자는 Hex-ray기능이 없어서 ㅜ 그냥 제가 Mac에서 그나마 싸게 돈주고 쓸만한 정적분석도구가 저거밖에 없어서 ㅜㅜ 단순히 장점이라하면 코드패치해줄때 굉장히 윤택하다? 2017.07.06 13:34 신고
댓글쓰기 폼