PLT (Procedure Linkage Table) : 외부 프로시저를 연결해주는 테이블.
PLT를 통해 다른 라이브러리에 있는 프로시저를 호출해 사용할 수 있다.
GOT (Global Offset Table) : PLT가 참조하는 테이블. 프로시저들의 주소가 들어있음.
쉽게 말하면 C언어에서 자주사용하는 printf 함수를 호출할 때
printf가 처음 호출된다면
PLT 이동 > GOT로 점프 > GOT를 참조 > 다시 PLT이동 > _dl_runtime_resolve > 함수 호출
여기서 _dl_runtime_resolve 라는 함수는 필요한 함수의 주소를 알아오고,
GOT에 그 주소를 써준 후 해당 함수를 호출한다.
printf 함수의 호출이 처음이 아니라면
PLT 이동 > GOT로 점프 > GOT 참조 > 함수 호출
( 이전에 printf 를 호출했었기 때문에 printf함수의 주소를 가지고 있다.)
간단한 코드를 가지고 확인해보겠다.
print@plt 의 주소를 보면
여기서 jmp하는 0x804c00c가 뭔지 봤는데 print@got.plt라고 나온다.
여기서 하나 의문점을 가지고 있던게 있다. 다른분들의 디버깅 과정을 봤을때
첫 호출하는 printf@plt의 주소값을 찍어보면
이런식으로 jmp, push, jmp과정을 거치는데 내가 disas를 했을때는 조금 달라서 의문점을 가졌다.
대충 컴파일러의 버전에따라서 달라지는것 같은데 자세히 들어가서 분석하자면
0x08049074에 break point를 걸고 실행 하여 봤을때
printf@got.plt 로 jmp해서 들어가고
그 다음과정을 step over해서 봤을때
printf함수를 찾아간것을 확인 할 수있다.
처음 printf@got.plt의 주소가 0x08049040이였고 그다음 실행시키고 다시 찍어봤을때
주소가 바뀐것을 확인 할 수 있다.
0xf7e1dde0의 주소는 printf인것을 확인 할 수있다.
첫번째 printf는 이와같이 실행되고 두번째 printf는 이 과정을 생략하고 printf로 바로 접근하는 것을 볼 수있다.
'System Hacking' 카테고리의 다른 글
UAF (Use After Free) (0) | 2022.03.12 |
---|---|
Return to Libc (RTL) (0) | 2022.02.18 |
GOT Overwrite (0) | 2022.01.22 |