chipkkang9's story

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

CTF/Pwnable

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

chipkkang 2021. 11. 29. 19:18

준비물


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] passcode

 

문제풀이


문제 화면부터가 굉장히 어지럽다.

이번 주차에 배운 개념이 카나리라서 그런 걸까... 심오한거같네...

 

우선 프로그램을 받고 IDA로 열어보았다.

 

바로 보이는 main 함수

 

main 함수는 이와 같다.

쭉 읽어보면,

generate_passcode 함수에서 난수로 패스코드를 생성하고 있고,

중간에 puts함수로, 그 안에는 passcode가 있을 수 있음을 암시하고 있다.

 

자세히보니, buf의 크기는  0x18개인데, 12번째줄에서 0x30개를 입력받고 있다.

여기서 알 수 있는 것은  printf함수를 통해서 널바이트를 뚫을 수 있다는 것,

그리고 이로 leak을 일으켜 passcode를 얻을 수 있겠다는 것을 알 수 있다.

 

여기까지 구현하는 프로그램을 pwntools를 이용해 구현해보았다.

 

passcode를 얻는 pwntools 코드
solve.py를 실행시킨 화면

 

이렇게 구현해주고 실행시키면,

printf 뒤에 있는 데이터들이 leak 되는 것을 확인할 수 있다.

 

그렇다면, 해당 passcode를 다시 받아서 비교시킨 후,

ret 값에는 system(cat flag); 명령어가 있는 win함수로 이동시키면 문제 해결일 것이다.

(사전에 찾아보았더니, win 함수에 system 함수가 들어있었다.)

 

gdb에서 p (함수이름)을 검색하면 해당 함수가

어떤 주소에 존재하는 지 알 수 있다.

 

win의 주소를 알아보았다.

 

win의 주소를 찾아보니, 0x4012d0의 위치에 존재함을 알 수 있었다.

 

그럼 이제, passcode를 받아 비교하는 것.

비어있는 스택을 채워주고, rbp를 임의의 값으로 채워준 후,

ret 영역에는 win함수를 호출하게끔 pwntools로 구현해주면 된다.

 

완성된 코드는 다음과 같다.

 

solve.py 완성본

 

 

solve.py를 실행한 결과

 

구현한 프로그램을 실행시키니 flag가 잘 나오는 것을 확인할 수 있었다.

 

솔직히 2번 어려웠다... 정확히 어떻게 풀리는 로직인지 아직 완벽하게 이해하진 못한 것 같다.

나중에 조금 더 알아보기 쉽게 블로그를 수정해보겠다.

Comments