KDHzoot's Github

Code for study, project, etc

자세히보기

정보보안/pwnable.kr

[pwnable.kr] passcode

kdhzoot 2018. 11. 8. 16:20

치킨은 맛있다.



c코드만 보면 쉬워보인다. 그런데 해보면 segfalt가 뜬다.

scanf에서 인자를 변수의 주솟값이 아니라 변수의 값 자체를 넘겨주기 때문이다.



따라서 system함수를 실행시키기 위한 다른 방법을 찾아야한다.

먼저 생각해 볼 수 있는 것이 welcome에 있는 name 배열을 이용하여 welcom 함수의 ret를 system함수로 조작해주는 것이다.

그러나 입력받는 값이 100글자이고 canary가 걸려있어 bof는 안된다.

마찬가지로 nx가 걸려있어서 shellcode도 안된다.



여기서 알아내기 힘든것이 name배열의 96에서 100번째 글자 4바이트가

login 함수의 password1의 위치이다.


어셈블리어 코드를 보면 welcome 함수와 login 함수의 호출이 바로 인접해서 일어남으로 ebp의 주소는 같을 것이다.

그리고 scanf를 호출 할 때 인자로 넣어주는 주솟값을 잘 살펴보면 ebp-? 식으로 edx에 넣는다.

따라서 변수들의 시작주소를 비교해보면 

name은 ebp-112 부터 ebp-12 까지이고

password1는 ebp-16에 위치한다.


따라서 아까 말한대로 name의 96부터 100번째 4바이트가  password1의 주소이다.

사진을 첨부하지 않은 것은 이해에 불필요하기 때문이 아니라 귀찮아서이다.



따라서

name의 96개는 dump값으로 채워주고

뒤의 4바이트 (password1)의 값을 fflush함수의 got로 채워준다.

이제 password1 scanf가 있는 부분에서는 입력받은 값을 password1의 값, 즉 fflush의 got영역에 덮어씌우게 된다.

여기서 fflush의 got에 login 함수에서 system의 주소를 입력해주면 fflush함수 호출 시 system함수를 호출하여 flag가 출력된다.




exploit 과정


1. name의 값에 96(dump) + 4(fflush_got_addr) 를 넣어준다

2. password1 scanf를 할 때 login함수 내 system이 호출되는 주소를 입력한다.

3. 끗



exploit code




'정보보안 > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] mistake  (0) 2018.11.08
[pwnable.kr] leg  (0) 2018.11.08
[pwnable.kr] input  (0) 2018.11.08
[pwnable.kr] random  (0) 2018.11.08
[pwnable.kr] echo1  (0) 2018.11.05