CTF 스터디

[pwnable.kr] 5번_ passcode 풀이

dalgorithm 2021. 3. 31. 01:11
728x90

포너블 5번_passcode 문제 풀이

 

화면의 ssh passcode 문제로 로그인을 해준다.

내용을 보면 컴파일되는 중에 컴파일 에러가 뜬 것 같다.

 

passcode.c 파일을 출력하였다.

코드를 읽어보니 passcode1이 338150이고 passcode2가 13371337일 경우 플래그를 읽는다.

 

그런데 코드를 보면 scanf로 passcode 1,2 를 입력받는 부분을 보면 &연산자가 없다.

주소를 참조해서 변수에 값을 넣는게 scanf인데, 주소를 참조하지 않고 passcode1, passcode2라는 

변수를 넣었기 때문에 이 값을 참조해 입력값을 받아온다.

 

이 부분에서 컴파일 경고가 뜬 것을 예상해 볼 수 있다.

 

PLT(Procedure Linkage Table)과 GOT(Global Offset Table)에 대한 사전 지식이 필요하다.

bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/

 

PLT와 GOT 자세히 알기 1

Dynamic Linking 과정을 추적해 PLT와 GOT를 이해해보자 :) 시스템 해킹을 공부하시는 분들이라면 PLT와 GOT에 대해 알고 있을 것입니다. 이제 막 시스템 해킹 공부를 시작한 분들도 한 번 쯤 들어보셨을

bpsecblog.wordpress.com

 

 

welcome 함수에서 name[100]을 입력받도록 하는데, ebp-0x70에 입력을 받는 것으로 보인다.

100byte를 입력받게끔 하고 있으므로  ebp-0x70~ebp-0xC까지 name이 차지하는 공간이 된다.

 

login 함수를 보면 passcode1과 passcode2를 상수와 비교하는 구문을 찾으면 passcode1과 passcode2가 저장되는 곳을

알 수 있다. 전자는 ebp-0x10에, 2는 ebp-0xc에 저장된다.

 

앞의 name[100]에서 마지막 4바이트로 passcode1을 덮어 쓸 가능성이 있다.

 

간단하게 정리하고 넘어가자면, PLT란 외부 프로시저를 연결해주는 테이블로, PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다. 또한, GOT란 PLT가 참조하는 실제 프로시저의 주소가 들어있는 테이블이다.

 

passcode1 변수에 특정 프로시저의 GOT 주소를 적어 해당 프로시저로 이동하는 

GOT overwrite라는 방법을 이용해야한다.

 

name함수를 받을 때 passcode1의 값을 정할 수 있다. 따라서 scanf 다음 코드인 fflush함수의 주소를 passcode1에 넣을 것이고 passcode2에는 system함수의 바로 전단계 명령을 집어넣어 문제를 파악해 본다.

 

fflush의 GOT 값은 0x804a004이다. passcode2에 넣을 값을 구하기 위해서는 디스어셈블링된 코드를 보고

system 바로 이전의 명령어 주소를 확인해야한다. 위에 disas login 부분을 보면 확인할 수 있다.

0x080485e3이다. 하지만 passcode2에는 10진수 형식으로 변환해주어야하는데 이 값을 변환해주면

134514147이 나오고, 이를 넣어주면 된다.

 

name 마지막 4바이트는 passcode1의 값으로 더미값 96바이트를 넣어주고 끝에 fflush의 GOT를 넣는다.

 

'a'*96+"\x04\xa0\x04\08"+"134514147"

728x90