티스토리 뷰

포너블/pwnable.kr

passcode 풀이

삼전동해커 2020. 9. 15. 23:31

너무어렵다이문제...



함수가 3개 있다. login,welcome,main.

일단 main에서 welcome을 호출하고 login을 호출한다.


welcome함수를 보면

name 배열 100바이트를 주고,

이름을 scanf로 받는데 &name이 아닌 그냥 name으로 받는다. 이상하네


login함수는

passcode1,2를 주고,

passcode1을 입력하는데 또 그냥 passcode로 받는다.

fflush(stdin)을 실행하는데 이 함수는 입력버퍼를 초기화하는 함수이다.즉, 앞에서 받은 passcode1을 초기화 한다는 의미이다.

그리고 passcode2를 받는다.

passcode1 == 338150 && passcode2 == 13371337이면 풀린다고 한다.


그냥 넣어보면


seg fault가 뜬다.

이건 scanf때문에 오류가 나는 것이다.


scanf함수는 &변수를 이용해 입력받은 변수의 주소에 저장을한다.

하지만 &없이 변수만 사용하면 그 변수명 자체가 주소로 인식을 한다.

없는 주소에 값을 넣으니 오류가 날수 밖에 없다.


이 오류는 뒤에서 사용하겠다.


일단 gdb로  welcome함수 먼저 열어보면



welcome+3에서 0x88(136)만큼 스택을 확장했고,

welcome+38과 welcome+58에서 ebp-0x70을 scanf로 받았고, printf로 출력한다.

ebp-0x70(112)이 name의 위치인것 같다.


다음으로 login함수를 열어보면




login+34에서 scanf를 실행했다. 그럼 그 위 login+24의 ebp-0x10이 passcode1의 위치이겠다.



이 때의 스택의 모습을 가져왔다.



출처 : https://eunice513.tistory.com/288


여기서  login함수와 welcome함수의 위치가 같은(ebp의 위치가 같은)이유는 main함수를 보면



welcome이 끝난 뒤, 바로 login 함수를  부른다. 

이 때문에 ebp의 위치가 변함이 없다. 그래서 위 같이 같은 위치가 될 수 있다.


아까 scanf함수에 오류가 있었다고 했다.

오류가 입력된 변수의 값 자체를 주소로 인식한다는 점이다.

그럼 값으로 주소를 주면 된다.


어떤 주소를 주냐면 fflush의 GOT 주소이다.


GOT는 간단하게 함수의 주소를 공유하는 라이브러리이다. GOT에 fflush의 주소를 담고 있는 위치가 있는데 거기에 조건문의 system의 주소를 넣어주면 fflush대신 system을 호출할 수 있다.


정리해보면 name을 쭉 입력하다 passcode의 위치를 만나는 지점이 있다. 그 위치에 fflush의 GOT를 입력 후 system주소를 넣어주면 된다는 것이다.


그럼 GOT의 위치를 찾아보자.


fflush가 호출되는 위치에서



fflush가 어떻게 호출되는지 찾아보면



이런 과정을 거치는데



그중 0x0804a004가  GOT의 위치이다.



다음으로 system의 위치를 찾아보자.



변수까지 포함해서 0x080485e3이 system의 위치이겠다.

그럼 익스플로잇은


name[96]+GOT[4]+system[4]으로 하면 된다.


여기서 주의할 점이 system의 주소를 10진수로 바꿔줘야 한다. 

왜냐하면 passcode가 %d로 받기 때문이다.





으 됐따.


'포너블 > pwnable.kr' 카테고리의 다른 글

pwnable.kr bof 풀이  (0) 2020.09.14
col 풀이  (0) 2020.09.14
fd 풀이  (0) 2020.09.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함