함수의 got 구하기

두비니

·

2020. 10. 9. 23:15

 

생각보다 물어보는사람이 많아서... 걍 정리글 씁니다

 

 

 

제가 아는 방법은 두가지 방법 정도가 있는 것 같아요. 저는 첫 번째 방법을 추천합니다.

 

1. gdb 사용

 

첫 번째 방법은 gdb를 이용합니다. gdb -q (파일명)으로 gdb를 실행하고, gdb로 p (함수명) 입력해 함수의 plt주소를 찾습니다.

+) 이때 프로그램을 실행시켜 함수를 실행하면 다른값을 보여주니 gdb 실행하고 다른 명령 하지말고 바로 p (함수명) 해주시길 바랍니다.

 

그렇게 함수의 plt를 알아낸 다음, 그 주소의 plt가 jmp하는 곳이 got주소입니다.

 

짜잔

다음 사진의 경우 printf의 got는 0x601238입니다.

왜 저런 과정을 통해서 구해지는지 모르겠다구요? 참고1을 읽어봅시다. 기본적인 plt와 got의 지식이 필요하네요.

 

참고1 : bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/

 

PLT와 GOT 자세히 알기 1

Dynamic Linking 과정을 추적해 PLT와 GOT를 이해해보자 :) 시스템 해킹을 공부하시는 분들이라면 PLT와 GOT에 대해 알고 있을 것입니다. 이제 막 시스템 해킹 공부를 시작한 분들도 한 번 쯤 들어보셨을

bpsecblog.wordpress.com

 

2. IDA 사용

 

두 번째 방법입니다.

아이다를 사용하는 방법인데, 우선 pseudocode창 말고 다음과 같이 IDA view창을 킵시다.

 

저 상태에서 Alt+t를 눌러서 text finder를 킵시다.

그러고 난 뒤에 plt를 입력해서 보면

 

 

대충 이런 창이 뜰겁니다. 

저상태에서 엔터를 한번 더 치면

 

이렇게 모든 함수의 got테이블이 뜹니다. printf의 got가 첫 번째로 구한 방법과 동일한 것을 알 수 있죠?

뭐 두 번째 방법은 굳이?의 영역인거같아요. 저도 두 번째 방법은 그냥 어쩌다가 찾은거라 별로 저게 맞는 방법일거같지도 않고, 첫 번째 방법이 정석이니 정석을 애용하도록 합시다.

 

 

+) IDA 왼쪽에 뜨는 extern의 주소를 쓰면 안되나요?

 

네 안됩니다. 여기 말하는거같은데

 

IDA에서 함수를 extern이라고 표현하는 경우는 다른 모듈에서 알 수없는 주소가있는 경우입니다. 이런 경우 기호를 나타 내기 위해 IDA에서 만든 의사 세그먼트가 extern 세그먼트입니다. 따라서 GOT랑은 다릅니다. 아무튼 쓰면 안됨!

 

위 내용을 다루고 있는 참고2도 한번 읽어보시길!

 

참고2 : stackoverrun.com/ko/q/10375062

 

 

 

3. pwntools 사용

 

솔직히 pwntools밖에 안씀...

예시와 같이 봅시다

 

 

e를 통해서 라이브러리를 정하고, 그 뒤에 symbols나 plt, got를 통해서 값을 불러오면 됩니다.

경우는 다음과 같이 나뉩니다.

 

  • plt : 말그대로 함수의 plt가 필요한 경우
  • got : 말그대로 함수의 got가 필요한 경우
  • symbols : 사용자 지정함수의 주소가 필요한 경우

제일 편한 대신에 서버만 주어진 경우에는 이를 사용하지 못합니다.