-
GDB 사용 시 set 명령어표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 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 명령어와 결과를 비교하면 제대로 실행된 것을 볼 수 있다.
반응형'표튜터와 함께하는 Pwnable > Pwnable 개념 및 정리' 카테고리의 다른 글
/proc 디렉토리 관련 정리 (0) 2019.02.19 PIC란 (0) 2019.02.17 정적라이브러리와 동적라이브러리로 컴파일하기 (0) 2019.02.17 Mitigation의 종류 (0) 2019.02.15 PLT 와 GOT (0) 2019.02.14 댓글