본문 바로가기
Wargame/pwnable.kr

pwnable.kr passcode

by morae23 2019. 2. 1.

Pwnable.kr

# [Toddler’s Bottle] passcode

 

 

passcode.c 파일을 열면 아래와 같이 main(), login(), welcome() 함수를 볼 수 있다.

 

 



 

 

이 때, login() 를 보면 scanf()를 할 때 passcode1 passcode2의 주소가 아닌 값을 전달하는 것을 볼 수 있다.

 

따라서 Segmentation Fault가 발생할 것으로 예상된다.

 

 



 

 

이 때, welcome()을 호출한 뒤 login()을 호출하는 것을 알 수 있다.

따라서 welcome에서 name A 100개로 채워보았다.

 

 



 

 

그 뒤, login()을 호출하였을 때, welcome()에서 스택에 저장한 값이 남아있는 것을 볼 수 있다.

 

 



 

 

passcode1에 해당하는 ebx-0x10의 값을 보면 0x41414141이다. 이 점을 이용하여 입력하는 값을 저장할 주소를 적당히 적어주면 될 것으로 보인다.

 

하지만 passcode2의 경우 A를 최대 개수만큼 입력하였음에도 불구하고 값을 덮어 쓸 수 없다. 따라서 두 변수에 원하는 값을 모두 입력하는 것은 어렵다.

 

 



 

 

이 때, 위의 코드를 다시 보면 fflush()를 호출하는 것을 볼 수 있다.

따라서 fflush() GOT system(“/bin/cat flag”)의 주소로 overwrite해서 풀 수 있다.

 

 



 

 

먼저 fflush()의 주소인 0x08048430을 보면 got.plt 0x0804a004 jump하는 것을 볼 수 있다.

 

이 때 0x0804a004에 담긴 값인 0x08048436 plt+6인 것을 보면 0x0804a004 GOT임을 알 수 있다.

 

 



 

 

따라서 0x0804a004 0x080485e3을 넣어주면 된다.

 

 



 

 

이 때, 0x080485e3 scanf 10진수를 입력받고 있기 때문에 10진수로 바꾸어 134514147로 넣어주어야 한다.

 

 



 

 

이렇게 하면 clear할 수 있다.

 

 



 

 



'Wargame > pwnable.kr' 카테고리의 다른 글

pwnable.kr cmd1  (0) 2019.02.01
pwnable.kr asm  (0) 2019.02.01
pwnable.kr random  (0) 2019.02.01
pwnable.kr collision  (0) 2019.02.01
pwnable.kr flag  (0) 2019.02.01

댓글