passcode 문제다.!
조금 시간이 걸렸다ㅜ
문제의 의도를 파악하는데 시간이 많이 들었다.!
passcode 문제 클릭!
(passcode 문제)
문제화면은 다음과 같다.
(문제)
소스코드를 확인하자!
(소스코드)
뭘까?
실행해보자!
(로그인)
이 문제를 알기위해 나는 나의 레드햇 32비트에서 소스코드를 컴파일하여 gdb를 통해 디버깅하였다.
그러던 중 신박한 사실을 알았다.
일단 문제의 원인은 scanf 에 있었다.
(문제의 원인)
디버깅한 어셈블리로 확인해보자!
(문제의 scanf)
원래는 그냥 [%ebp-4] 여야하는데 앞에 PTR이 붙었다. 그래서 ebp-4 위치에 있는 값을 주소로 인식하여 그 값의 주소에다가 그 다음 입력한 정수를 집어 넣으려 하니 segmentation fault가 나는 것이었다.
예를 들어 앞에 입력값 A 100개를 주면 아래와 같은 현상이 일어난다.
(이름으로 A 100개 입력)
여기 까지 왔을 때 문제의 의도를 파악했다.
그렇다면 마지막 0x41414141 대신 내가 원하는 주소값을 넣고
그 다음 숫자값으로 그 주소값에 내가 원하는 값을 넣을 수 있다는 말.!
정리해서 말하면 원하는 위치에 원하는 값을 4바이트 넣을 수 있다는 말이다!
그렇다면 그다음 호출되는 함수의 got를 오버라이트 해서 해결해보겠다!!!
(공격 타겟)
fflush이다.
여기다가 login 함수에서 system 함수를 호출하는 부분 (인자구성해주는부분포함해서) 그 쪽부터 시작되게 할 것이다.
그 위치를 파악하기 위해 objdump로 확인해보자!
(objdump)
(login 함수)
이제 fflush got 위치 찾기이다.
readelf 를 이용하여 파악해보자!
(3번째 위치)
그렇다면 fflush 위치는?
(GOT주소)
입력할 숫자 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 |