티스토리 뷰
출처 : 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
- many-to-many
- SVM
- automotive
- 크로스 엔트로피
- 로지스틱회귀
- 차량 네트워크
- Ethernet
- CAN-FD
- cuckoo
- 딥러닝
- PCA
- json2html
- HTML
- problem statement
- SOME/IP
- Python
- AVTP
- 논문 잘 쓰는법
- 이상탐지
- porks
- 머신러닝
- many-to-one
- 회귀
- 케라스
- 차량용 이더넷
- AVB
- AE
- one-to-many
- 단순선형회귀
- automotive ethernet
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |