chipkkang9's story

[Whois 정보보안교육] canacode 문제풀이 본문

CTF/Pwnable

[Whois 정보보안교육] canacode 문제풀이

chipkkang 2021. 11. 29. 23:59

준비물


IDA Pro 7.0, Linux 작업환경 (본인은 kali linux를 사용함)

https://hex-rays.com/ida-pro/

 

IDA Pro – Hex Rays

Substantial changes Is to be expected in every release: new features, supported processors, etc which are all added after deliberation and discussion.

hex-rays.com

 

문제소개


[DoPwn] canacode

 

문제풀이


포너블 2주차 마지막 문제는 canacode라는 문제이다.

난이도는 개인적으로 맞고 나서도 일주일동안 맞은 곳이 얼얼한 느낌이다.

 

우선 IDA를 통해 소스코드를 참고했다.

문제 통과 조건은 main 함수에서 init_shell이라는 함수로 넘어가기만 하면 됐다.

(차후에 flag를 따는 것까지 해볼 생각이다.)

 

main 함수

 

main 함수는 위와 같다.천천히 풀 방법을 생각해보면,12번째 줄에서 read 함수로 buf에 입력을 받고 있다.그리고 15번째 줄에서도 read 함수로 s2에 입력을 받고 있다.

 

buf는 0x10의 크기인데도 0x48만큼 입력을 받고 있고,s2는 0x28인데도 0x40만큼의 입력을 받고 있는 것으로 보아 BOF를 노린 것 같다.

 

그리고 하나 더 고려해야 할 것이 바로 이 문제는 카나리를 이용한다는 점이다.

 

어셈블리영역에서 확인할 수 있는 카나리

 

해당 파일에 카나리가 있음을 확인할 수 있다.

 

그렇다면 조건은 다 알았다. 어떻게 풀어야 할까?

 

 

12번째줄에서 buf를 모두 덮은 후에, 카나리를 leak을 통해 확인한다.

그리고 확인한 카나리값을 변수에 저장한다.

 

그리고 15번째줄로 내려가서 s2를 입력시켜주면서, C코드에 있는

"Yes"비교문을 만족시켜준 후, 카나리 상위 스택들을 모두 임의의 값으로 채워준다.

그에 이어서 아까 저장해 놓은 카나리값을 전달하여 stack smash 오류를 피하고,

rbp도 임의의 값으로 채운 후, ret영역에 init_shell의 주소값을 넣는 프로그램을 구현하면

flag는 나오지 않겠지만 init_shell 로 넘어갈 수는 있을 것이다.

 

이를 pwntools를 통해 구현한 결과는 다음과 같다.

아무래도 구상과 구현에 있어서 파이썬을 처음 사용해보는 나는 어려움이 있어서

0xsmlijun 선배님의 도움을 많이 받았다.

 

위의 문장들을 파이썬으로 구현한 결과

그리고 이를 동작시켜주면,

 

pwntools가 제대로 동작하는 모습

이와같이 다행히도... 올바르게 동작하는 것을 확인할 수 있다.

 

사실 flag를 얻으려면 init_shell에서 shellcode를 넘겨주어

관리자 권한으로 프로그램을 실행하여야한다.

 

이는 추후 글을 수정하여 더 덧붙이도록 하겠다!

 

Comments