pwnable.kr passcode 풀이
2016.08.15.
passcode 코드
+) fflush(stdin)?
잔류한 입력 버퍼를 지울 때 사용한다. 예를 들어 무언가를 입력하고 엔터를 쳤으면 이 엔터는 어디 가지 않고 버퍼에 남게 된다. 이런 것들을 청소할 때 쓰는 명령어
여기서는 passcode1을 입력하면 fflush로 stdin에 passcode1에 들어갔던 입력값을 지운다.
일단 코드를 실행시켜 passcode1과 passcode2에 각각 338150, 13371337을 입력해보자
코드대로라면 cat flag를 실행시켜야하지만 세그멘테이션 폴트가 떴다.
그런데 코드를 자세히보니 scanf함수에 &가 없다. ‘&변수’형태가 변수가 들어있는 주소이고 scanf가 이 주소에 들어있는 값을 가지고온다고 알고 있는데 &가 없으면 변수자체를 주소로 인식하여 여기에 입력한 값을 가져온다. 변수자체가 주소이므로 passcode에 숫자 입력 시 세그멘테이션 폴트
따라서 name도 주소
변수자체가 주소가 되므로 passcode1과 passcode2를 338150, 13371337과 비교하는 것은 안된다. 그래서 여기를 넘어가야하는데 여기서 plt,got를 사용한다.
→name변수는 ebp-0x70부터 받는다.
→passcode1변수는 ebp-0x10부터 받는다.
*실제 name변수는 96byte입력 ( 0x70-0x10 )
+) PLT, GOT?
http://expointer.tistory.com/13
printf의 PLT주소는 GOT영역의 주소를 가리키고 있다. 그리고 다시 PLT 영역으로 돌아오는데 dl_runtime_resolver( got의 위치에 함수의 주소 찾아 저장 )로 점프
(\x90*96)+(GOT@printf or GOT@exit)+system(“/bin/cat flag”)로 구성
→got주소를 부름으로써 scanf의 변수로 들어가 passcode1대신 입력받음
plt의 주소 : 0x08048410 got의 주소 : 0x08049ff4
plt에 got가 어떻게 들어가 있나 확인
login함수를 통해 “/bin/cat flag”의 주소를 확인한다.
0x080485e3
Flag : Sorry mom.. I got confused about scanf usage :(
'PWNABLE > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] FD (0) | 2016.09.27 |
---|---|
[pwnable.kr] BOF (0) | 2016.09.27 |