이 문제를 풀면서 got와 Plt사이의 관계에 대해 확실히 알게 되었다. 처음 GOT를 참고 할 때 _dl_runtime_resolve () 함수가 호출되지 않았기 때문에 GOT는 PLT의 다음주소를 가르키고 있다. 그 후 _dl_runtime_resolve()함수에 의해 라이브러리의 base주소를 얻어 오고 그 다음 오프셋을 더해 해당하는 함수의 주소 값을 받아 온다. 따라서 해당 라이브러리의 image base를 조작할 수 있다면 호출되는 함수의 주소 값 또한 변조되어 우리가 원하는 함수나 쉘을 실행 시킬수 있게 되는 것이다.
일단 문제를 보자.
게임에서 이기면 argv[1]에서 값을 가져와 이 값이 0x804 혹은 0xB로 시작이 되지 않으면 argv[1]에 해당하는 주소값에 4바이트 입력 값을 쓰는 문제이다. 일단 GOT 주소나 ret를 변조 할 수 없기 때문에 GOT의 함수 주소를 불러 올 때 사용되는 _dl_runtime_resolve ()함수에서 라이브러리의 base주소를 변조해서 쉘을 떨어뜨리는 방향으로 가자.
Dl_runtime_resolve함수의 전체이다. 여기서 _dl_fixup함수가 호출 된 이후를 보자.
호출된 직후 레지터터 상태를 보면 eax에 이미 exit함수의 주소가 찍혀있는 것을 볼 수 있다. 그렇다면 _dl_fixup함수를 살펴 보자.
위에 보이듯이 0x40071000에서 값을 받아 와서 거기에 0x2d1a만큼 더한 곳의 주소 값을 eax에 넣고 있다. 즉 호출되는 exit함수의 주소 값이 저렇게 결정된다는 것이다.
그렇다면 우린 0x40071000의 주소에 우리가 원하는 쉘코드 주소 – 0x2d1a 의 값을 써주면 쉘이 떨어 진다.
'Wargame' 카테고리의 다른 글
[pwnable.kr] tiny (0) | 2014.11.15 |
---|---|
webhacking.kr 23 (6) | 2014.11.13 |
bashshock~~!! (0) | 2014.10.13 |
[pwnable.kr]brain_fuck (0) | 2014.09.27 |
[pwnable.kr]input (0) | 2014.09.26 |