728x90
반응형
특정 함수를 실행시키고자할때
plt를 써야하나?
got을 써야하나?
libc로 로드된 함수 주소를 써야하나?
아니면 모두 상관 없나?
2022-07-22 clear
got에 대한 이해가 부족했다.
정리해보자면
동적 링크, 정적링크부터 이해해야하는데, 차이라면 해당 함수가 프로그램에 포함되느냐 마느냐이다.
동적 할당은 프로그램에 포함되지 않고, 각 함수의 offset 만 기억하고 있으며,
정적할당은 프로그램에 포함되어버리는 것이다.
그래서 동적 할당 시 각 함수의 위치를 찾을 수 있는 명령어들이 해당 함수 call 시 포함된다.
이때 쓰이는 것이 plt와 got.
plt는 got에 실제 함수의 위치를 넣어주는 역할을 하고
got는 실제 함수의 위치를 담고있는 역할을 한다.
이를 gdb로 확인해보면
우선 프로그램 실행 전에는 아래와 같고
gef➤ p puts
$1 = {<text variable, no debug info>} 0x400570 <puts@plt>
gef➤ x/i 0x400570
0x400570 <puts@plt>: jmp *0x200aa2(%rip) # 0x601018 <puts@got.plt>
gef➤ x/x 0x601018
0x601018 <puts@got.plt>: 0x00400576
프로그램 실행 후에는 아래와 같다.
gef➤ b *main
Breakpoint 1 at 0x4006a7
gef➤ r
Starting program: /home/kali/Downloads/1/rop
[*] Failed to find objfile or not a valid file format: [Errno 2] No such file or directory: 'system-supplied DSO at 0x7ffff7fca000'
Breakpoint 1, 0x00000000004006a7 in main ()
gef➤ p puts
$2 = {int (const char *)} 0x7ffff7e4de10 <__GI__IO_puts>
그럼 이 주소는 어떻게 찾느냐.
쉽게 설명하면 라이브러리 파일의 시작을 0으로 두고 특정 함수의 위치가 어디있는지 offset만 알면 찾을 수 있다.
하지만 라이브러리 버전에 따라 그 offset이 다르기에 이를 기준으로 프로그램이 어떤 libc 파일을 쓰고있는지 알 수 있다.
또한 libc 버전을 알 수 있으면 다른 함수가 어디있는지도 알 수 있다.
728x90
반응형
'To do list > Complete' 카테고리의 다른 글
for "one" - rao (0) | 2022.11.16 |
---|---|
[dreamhack] basic_exploitation_003 (0) | 2022.08.01 |
64bit system 함수 segmentation fault 오류 (0) | 2022.07.19 |
[Root-Me] ELF x86 - Stack buffer overflow basic6 : /bin/sh 주소 찾아 넣어서 실행해보기. (0) | 2022.07.14 |
[Root-Me] ELF x86 - BSS buffer overflow : python 코딩해서 풀어보기. (0) | 2022.07.12 |