함수의 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/
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 : 사용자 지정함수의 주소가 필요한 경우
제일 편한 대신에 서버만 주어진 경우에는 이를 사용하지 못합니다.
'SYSTEM HACKING > PWNABLE&REVERSING' 카테고리의 다른 글
[Stack] Stack Frame 공부하기 - 2 (0) | 2021.03.02 |
---|---|
[Stack] Stack Frame 공부하기 - 1 (0) | 2021.03.01 |
[Stack] Fake EBP에 대하여 (2) | 2020.08.31 |
[Stack] RET sled에 대하여 (0) | 2020.08.08 |
[Stack] Frame Pointer Overflow, FPO에 대하여 (0) | 2020.07.30 |