IMyoungho 2019. 2. 15. 04:37

gdb 사용시 set 명령어를 이용하면 자신이 원하는데로 setting을 해서 진행해볼 수 있다.

예를 들어 아래와 같은 소스코드가 있다.

해당 코드를 컴파일 한 뒤 gdb를 열고 got overwrite를 진행해보도록 하겠다.




컴파일 후 gdb를 이용하여 어셈블리어 코드로 보았다.

printf@plt 호출 부분을 들여다보았다.





위에서도 볼 수 있듯, 현재 printf의 함수 호출 주소이다. 

이 PLT(Procdure Linkage Table)는 다른라이브러리에 있는 프로시저를

 호출해서 사용하는데 그 때 참조하는 것이 바로 GOT(Global Offset Table)이다.

got에는 프로시저들의 주소가 들어있다.

우리는 이 plt가 참조하는 프로시저들의 주소를 변조시키는 작업을 할 것이다.




printf 함수호출이 처음이기 때문에

printf 함수의 got에는 printf의 실제주소가아닌 plt+6의 주소가 들어있고

그 위치로 이동해서 printf 함수의 실제주소를 얻어오기위한 과정이 필요함으로

break point를 걸어주고 실행을 시킨다.(main에 걸었음)




실행 후 printf가 실제주소를 잘 얻어오는 것을 볼 수 있다.




이것은 libc에 있는 system 함수의 실제주소이다.

이제 system 함수 주소를 가지고 printf의 got에 

system 함수의 주소로 got overwrite를 할 것이다.

이 때 사용할 수 있는 명령어가 바로 set 명령어이다.


현재 printf의 got = 0x804a00c

libc에서의 system 함수 주소 = 0xf7e3dda0

set 명령어로 got overwrite 후 실행!




실행화면을 보면 소스코드에서는 분명히 printf 함수였는데 

system 함수가 작동하여 ls가 실행된 것을 볼 수 있다.


그 이유는 got가 system 함수 주소로 overwrite되면서 printf 함수 호출 시

plt가 참조하는 printf got가 printf 함수의 실제주소가 아닌 

system 함수의 실제주소를 참조하기 때문이다.




실제 ls 명령어와 결과를 비교하면 제대로 실행된 것을 볼 수 있다.




반응형