ssh로 서버에 접속해서 소스코드를 보았다. 사용자 이름을 받고  password1,2를 통과하면 flag를 출력해주는 프로그램이였다.



그래서 a를 많이 넣어보니 password를 입력하지 않았는데 checking에 들어가고 login failed하는 것을 알 수 있었다 bof 취약점이 있는 듯 하다. 그래서 name변수와 password1,2사이의 거리를 얼마나 떨어져 있는지 구해보기로 한다.

main --> welcome --> login 순으로 실행된다.



welcome 함수를 보면 esp-0x88만큼의 공간을 만들고 ebp-0xc에 eax값을 저장하고 ebp-0x70주소를 edx에 담는 걸로 보아 ebp-0x70주소가 문자열을 받는 시작주소인 듯하다. 후에 저장해뒀던 원래의 eax값을 다시 넣어준다.



passcode1이 ebp-0x10에 저장 되는 것을 알 수 있다.



정상적인 형식이라면 passcode1의 주소를 참조해서 그 주소의 공간에 값을 받지만 

위와 같이 passcode1앞에 &가 없으면 passcode1이 담고있는 값을 주소로 인식하고 그 주소에 을 저장하게 된다.

그래서 아래와 같이 segmentation fault가 발생했다. 



그래서 우리는 fflush plt안에 담고있는 fflush got주소를 system함수가 시작되는 주소로 변경시켜줘서 흐름을 바꿔주기로 한다.


<<낮은주소--- name버퍼(96=0x70-0x10) | passcode = fflush got (4) | 프로그램내에 system("/bin/cat flag")가 시작되는 주소 (4)   ---높은주소>>



fflush got의 주소 = 0x0804a004



프로그램내에 system("/bin/cat flag")가 시작되는 주소 = 0x080485e3 = 10진수로 134514147

10 진수로 넣어주는 이유는 scanf("%d",passcode1);로 들어가기 때문이다.



'System Hacking > pwable.kr' 카테고리의 다른 글

08.Pwnable leg  (0) 2018.02.15
06.Pwnable random  (0) 2018.02.15
04.Pwnable flag  (0) 2018.02.13
03.Pwnable bof  (0) 2018.02.13
02.Pwnable col  (0) 2017.11.23

+ Recent posts