Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- DOCKER-USER
- epoll
- cbpf
- wnourefresh
- ncurses
- packet filter
- 어셈블리어
- iptables
- .nret core 배포
- 취약점
- level trigger
- wrefresh
- epoll_wait
- edge trigger
- ioctl
- packet flow
- .net core 7
- C언어
- BOF
- Docker
- vtable
- doupdate
- architecture
- 풀이
- NAPT
- LOB
- REDIS
- rfc5508
- Compiler
- mvwin
Archives
- Today
- Total
Tuuna Computer Science
plt와 got 개념알기 feat. static or dynamic(Linking) 본문
실행파일을
gdb로 바이너리 파일을 디버깅하고 디스어셈하면 각 함수 호출부분에
call 0x40fad0 <puts> 와 call 0x4004a0 <puts@plt>을 볼 수 있다.
call 0x40fad0 <puts>이렇게만 적혀 있는 것은 정적링크로 컴파일 된 바이너리파일을 디스어셈하였을 때
볼 수 있는 현상이다. ( gcc -o (binary) (binary.c) -static : static옵션을 주면 정적링크로 컴파일 할 수 있다.)
그리고 call 0x4004a0 <puts@plt>은 바이너리를 동적링크로 컴파일했을 때 볼 수 있는 현상이다.
지금부터 동적링크와 정적링크와의 차이점과
동적 링크결과 함수 뒤에 붙는 Plt, Got에 대해서 알아볼 것이다.
일단 정적링크와 동적링크에대해서 알아보기 위해서는 C 언어로 작성된 소스파일이 어떻게 컴파일과정을 거치고
어떻게 바이너리 파일로 변환되는지에 대한 과정을 살펴볼 필요가 있다.
먼저 컴파일 과정을 살펴볼것이다.
사용자가 test.c라는 파일을 gcc로 컴파일하면
이는 test.i 파일이 먼저 생기고 다음 test.s
test.o (오브젝트파일)이 생긴다. 오브젝트 파일은 그 자체로 실행되지 않는다
만약 사용자가 printf코드를 적었는데 컴퓨터 printf의 구현코드를 모르기 때문에 printf의 구현코드가 있는 라이브러리파일을 링크해줘야 한다.
이를 링크과정이라 한다.
이 링크하는 과정에 따라 정적링크와 동적링크로 나뉘는데
정적 링크는 : 해당라이브러리를 오브젝트와 엮어 실행파일을 만들어 내기때문에 라이브러리를 따로 관리하지 않아도 된다는 장점이 있다.
하지만 해당 라이브러리를 사용하는 모든 프로그램들은 라이브러리의 내용을 메모리에 매핑시켜야 한다.
동적 링크는 : 공유 라이브러리라는 형식으로 실행파일안에 라이브러리를 포함되지 않고 메모리에 하나의 라이브러리를 올려놓고
여러 프로그램이 서로 공유해서 사용하는 방식이다. 하지만 이는 라이브러리에 의존해야한다는 단점이 있다.
이는 정적링크와 동적링크관의 파일크기를 볼 수 있다.
확실히 차이가 난다. 912704와 8712......
정적링크와 동적링크에 대해서 설명하였으니 동적링크때 사용되는
Plt와 Got을 알아 볼것이다.
Plt는 외부프로시저를 연결해주는 테이블 즉, PLT를 통해 다른 라이브러리에 있는 프로시저를 호출할 수 있다.
GOT는 PLT가 참조하는 프로시저들의 주소가 들어 있다.
Static Link 방식으로 컴파일 하면 라이브러리가 프로그램 내부에 있기 때문에 함수의 주소를 알아오는 과정이 필요하지 않지만,
Dynamic Link 방식으로 컴파일 하면 라이브러리가 프로그램 외부에 있기 때문에 함수의 주소를 알아오는 과정이 필요하다.
즉, 동적 링크는 <puts@PLT>를 통해 해당 puts주소가 있는 GOT으로 가야한다. (JMP)
위 그림을 보면
정적 링크의 경우 puts의 주소가 동일하지만
동적 링크의 경우 puts의 주소가 달라진다! 첫번째 주소는 GOT의 주소이고 두 번째 주소는 puts의 주소이다!
'Reversing' 카테고리의 다른 글
PE 파일 재배치 (0) | 2018.06.12 |
---|---|
[ UPack의 PE 헤더 분석 ] (0) | 2018.06.12 |
[Reversing.kr] Easy_ELF 비밀번호 찾기 (리버싱) (0) | 2018.04.15 |
[Reversing.kr] Easy_Crackme! 비밀번호찾기(find password) (0) | 2018.04.12 |
abex ' 2nd crackme:1 (시리얼 값 찾기) (0) | 2018.04.11 |
Comments