ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.