passcode 문제다.!

조금 시간이 걸렸다ㅜ
문제의 의도를 파악하는데 시간이 많이 들었다.!

passcode 문제 클릭!



(passcode 문제)



문제화면은 다음과 같다.


(문제)


로그인 프로그램을 만들었는데 어딘가 하자가 있는 모양이다.

소스코드를 확인하자!



(소스코드)



소스코드를 보니 멀쩡해 보인다.
뭘까?

실행해보자!



(로그인)



세그멘테이션 폴트?

이 문제를 알기위해 나는 나의 레드햇 32비트에서 소스코드를 컴파일하여 gdb를 통해 디버깅하였다.
그러던 중 신박한 사실을 알았다.

일단 문제의 원인은 scanf 에 있었다.



(문제의 원인)



바로 int passcode1 이 변수의 passcode1는 변수 주소이다. 그러기에 scanf에 넣을때 앞에 &를 붙여 주소를 표현해주어 그 변수 자리에 입력한 정수를 집어넣는 것이다.

디버깅한 어셈블리로 확인해보자!


(문제의 scanf)



바로 위에 빨간 박스가 문제이다.
원래는 그냥 [%ebp-4] 여야하는데 앞에 PTR이 붙었다. 그래서 ebp-4 위치에 있는 값을 주소로 인식하여 그 값의 주소에다가 그 다음 입력한 정수를 집어 넣으려 하니 segmentation fault가 나는 것이었다.

예를 들어 앞에 입력값 A 100개를 주면 아래와 같은 현상이 일어난다.



(이름으로 A 100개 입력)



그렇게 되면 0x41414141 위치에 입력받은 숫자를 저장하려할 것이고 여기서 에러가 나는 것이다.

여기 까지 왔을 때 문제의 의도를 파악했다.
그렇다면 마지막 0x41414141 대신 내가 원하는 주소값을 넣고
그 다음 숫자값으로 그 주소값에 내가 원하는 값을 넣을 수 있다는 말.!

정리해서 말하면 원하는 위치에 원하는 값을 4바이트 넣을 수 있다는 말이다!
그렇다면 그다음 호출되는 함수의 got를 오버라이트 해서 해결해보겠다!!!


(공격 타겟)



먹잇감이 포착됬다.
fflush이다.
여기다가 login 함수에서 system 함수를 호출하는 부분 (인자구성해주는부분포함해서) 그 쪽부터 시작되게 할 것이다.

그 위치를 파악하기 위해 objdump로 확인해보자!



(objdump)




(login 함수)



login 함수의 0x80485e3 위치부터 실행하면 비밀번호까지 얻을 수 있다. 고로 우리는 숫자 값에0x80485e3을 넣을 것이다. 

이제 fflush got 위치 찾기이다.
readelf 를 이용하여 파악해보자!



(3번째 위치)



바로 저게 got 영역에 들어있는 놈들인데 fflush가 3번째에 있다. 위치로는 got 시작영역부터 0x10 큰 위치가 fflush 위치가 된다.

그렇다면 fflush 위치는?


(GOT주소)



GOT 주소는 0x08049ff4 이므로 0x10 큰 0x0804A004 가 fflush 주소가 된다.

입력할 숫자 0x80485e3이 16진수이므로 10진수로 입력해야한다.
%d 가 10진수 표현이므로!




(10진수 표현)



이제 끝이다. 공격!




(공격)



이제 숫자를 입력한다!




(공격 성공)


'WarGame > 500 Project' 카테고리의 다른 글

(49/500) pwnable.kr - leg  (0) 2017.07.10
(48/500) pwnable.kr - random  (0) 2017.07.06
(46/500) - pwnable.kr - flag  (0) 2017.07.05
(45/500) - pwnable.kr - bof  (0) 2017.07.05
(44/500) - pwnable.kr - collision  (0) 2017.07.05

+ Recent posts