티스토리 뷰
출처 : https://bbolmin.tistory.com/33
https://g-idler.tistory.com/57
https://gdtbgl93.tistory.com/149
https://bpsecblog.wordpress.com/2016/03/07/about_got_plt_1/
먼저 프로시저가 뭔지 알아보자.
프로시저란?
정적링크와 동적 링크
PLT와 GOT
PLT(Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블. PLT를 통해 다른 라이브러에 있는 프로시저를 호출할 수 있다.
GOT(Global Offset Table) : PLT가 참조하는 테이블. 프로시저들의 주소가 담겨있다.
동적링크를 사용할 때 쓰는 메모리 공간이 바로 PLT와 GOT 이다.
printf()함수를 처음으로 호출한다고 해보자.
첫 호출 시에는 링커가 dl_resolve라는 함수를 사용해 printf()의 주소를 알아오고,
GOT에 그 주소를 써준 후 해당 함수를 호출한다.
예제로 알아보자.
main+16에서 puts를 처음으로 불러왔다. 원래는 printf()인데 왜 puts인지는 모르겠다.
puts의 어셈블리를 보면
PLT를 사용하는게 보인다.
그럼 처음 jmp문으로 가보자.
PLT에서 GOT로 점프했다.
그런데 잘 보니 GOT가 가리키는 주소가 PLT+6의 주소이다. 그럼
[printf 함수 호출] -> [PLT로 이동] -> [GOT 호출] -> [다시 PLT로 이동]
이런 과정이다.
PLT+6에서 0x18을 push하고 0x8048410으로 점프한다.
주소로 가보니
어떤 값을 push하고 또 어디로 이동한다.
이 jmp로 이동하는 곳이 _dl_runtime_resolve 함수의 주소이다.
이 함수가 printf()의 주소를 가져와 GOT에 저장한다.
'포너블 > 포너블 공부' 카테고리의 다른 글
ROP에 대해 (0) | 2021.01.02 |
---|---|
pwntools 이용하기 (0) | 2020.12.01 |
execve() 함수 (0) | 2020.09.08 |
Return To Libc 기법 (0) | 2018.07.31 |
레이스 컨디션 해킹 (0) | 2018.06.27 |
- Total
- Today
- Yesterday
- 머신러닝
- automotive
- CAN-FD
- cuckoo
- automotive ethernet
- 단순선형회귀
- 회귀
- AVB
- HTML
- Ethernet
- 논문 잘 쓰는법
- 로지스틱회귀
- problem statement
- SVM
- json2html
- 케라스
- 이상탐지
- 딥러닝
- SOME/IP
- many-to-many
- 차량 네트워크
- PCA
- many-to-one
- 차량용 이더넷
- 크로스 엔트로피
- Python
- porks
- AVTP
- AE
- one-to-many
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |