안경잡이개발자

728x90
반응형

pwnable.kr - lotto 문제풀이(Write Up)

문제 분류: 공격(Attack)


  이번 시간에 풀어 볼 문제는 pwnable.kr의 lotto입니다. 기존에 기초 프로그래밍 위주로 학습하고 보안 분야로 넘어오신 분들에게 적합한 문제라고 생각되어 이 문제 또한 앞 부분에서 다루게 되었습니다. 더불어 난이도 또한 낮은 기초 문제라서 기초 C언어 지식으로도 문제를 해결하실 수 있답니다.


  ▶ 문제풀이 사이트 주소: http://pwnable.kr/play.php



  이 문제는 SSH를 이용해 통신해야 하는 문제입니다. SSH는 원격지에 있는 서버에 접속하여 서버를 관리할 수 있도록 해주는 프로토콜입니다. 윈도우 10은 기본적으로 OpenSSH를 내장하고 있어 쉽게 SSH를 사용할 수 있지만 사용이 어려운 경우 Putty와 같은 별도의 소프트웨어가 필요할 수 있습니다. Putty는 https://www.putty.org에 접속하여 설치가 가능합니다.



  저는 위와 같이 윈도우에 내장된 OpenSSH를 이용해 서버에 접속해보았습니다.



  접속 이후에는 ls 명령어를 이용해 위와 같이 현재 루트 디렉토리에 어떠한 파일이 존재하는지 확인할 수 있습니다. lotto 실행 파일과 lotto.c 소스코드 파일이 존재합니다. 일반적으로 이러한 분석 및 공격 분류의 문제는 소스코드를 보면서 취약점을 파악해 실행 파일에 적용하여 Flag 값을 얻을 수 있는 방식입니다. 일단 간단히 ./lotto 명령어로 로또 프로그램을 테스트해보겠습니다.



  6자리의 로또 코드를 입력하라고 하는 군요. 다만, 제가 알기로 로또는 1부터 45까지의 숫자를 넣는 것인데 6자리를 문자열로 넣는 것이 조금 이상하다는 생각이 들었습니다. 일단 아래와 같이 cat lotto.c 명령어를 입력해 lotto.c 소스코드를 분석할 수 있습니다.



  소스코드를 확인한 결과 랜덤한 6개의 숫자가 lotto[] 배열에 저장되고, 숫자는 아스키 코드로 1부터 45까지의 랜덤한 숫자로 추출됩니다. 다만 아래쪽을 보면 이중 For문을 이용해 우리가 입력한 문자열과 배정된 당첨 lotto[] 번호가 일치하는지 확인하는 구문이 나옵니다. 저의 문자열 매칭 알고리즘 강의(https://blog.naver.com/ndb796/221240660061)를 들으신 분이라면 위 알고리즘이 잘못되었다는 것을 쉽게 파악할 수 있을 겁니다. 위 알고리즘은 단 하나의 로또 번호라도 일치한다면, match 변수의 값이 6이 됩니다. 즉, 하나만 번호가 일치해도 당첨이 되어버리는 잘못 작성된 소스코드라고 할 수 있습니다.


  우리는 이렇게 잘못 작성된 알고리즘을 이용하여 로또에 쉽게 당첨되는 공격(Attack) 시도를 할 것입니다.



  먼저 아스키 코드표를 봅시다. 이제 위에서 보이는 1부터 45까지의 아스키 코드 중에서 아무거나 6개를 넣으면 됩니다. 그러면 우연히 1개의 문자라도 로또 당첨 번호와 일치하는 경우 플래그(Flag) 값을 내뱉을 것입니다. 통계적으로 생각했을 때 대략 3~4번만 시도해도 답이 도출될 것이라 판단할 수 있습니다.



  위와 같이 문자열 "######"으로 몇 번 입력을 시도하니 플래그 값이 나왔습니다.

728x90
반응형