Dreamhack – Linux Exploitation & Mitigation Part 2 : PLT, GOT section

2rlo·2021년 8월 18일
0

2020 시스템

목록 보기
22/25
post-thumbnail

1 PLT, GOT

  1. Procedure Linkage Table(PLT): 외부 라이브러리 함수를 사용할 수 있도록 주소를 연결해주는 역할을 하는 테이블
  2. Global offset Table(GOT): PLT에서 호출하는 resolve 함수를 통해 구한 라이브러리 함수의 절대 주소가 저장되어 있는 테이블
  3. 존재 이유: Dynamcally linked binary의 경우 바이너리가 실행되기 전까지 라이브러리 함수의 주소를 알 수 없기 때문. 라이브러리가 메모리에 매핑된 후 라이브러리 함수가 호출되면, 정적 주소를 통해 해당 함수의 PLT와 GOT 영역에 접근함으로써 함수의 주소를 찾음

2 Example 4

PLT_example4 의 코드와 Build

main 함수 disassemble 결과
<main+42>에 위치한 <puts@plt> 확인 가능
0x08048485(<puts@plt> call 부분)에 break point 설정 후 실행

<puts@plt+0>에서는 0x804a00c 메모리를 참조하여 저장되어 있는 값으로 점프. 해당 메모리에는 <puts@plt+6>의 주소가 저장되어 있음. <puts@plt+6>에서는 스택에 0을 push한 후 0x8048310 함수로 점프.
이후 0x804a008 주소에 저장된 0xf7fee000 함수로 점프.

링커 라이브러리인 ld-linux.so.2 메모리에 있는 0xf7fee000 함수가 리턴하는 시점에 브레이크 포인트를 설정해 스택 메모리를 확인해보면 puts 함수로 점프하는 것을 보아, 0xf7fee000 함수는 호출된 라이브러리 함수의 주소를 알아내는 함수임을 알 수 있음.

3 Abusing PLT, GOT

  1. 특정 함수의 PLT를 호출하면 함수의 실제 주소를 호출하는 것과 같은 효과를 나타냄. PLT의 주소는 고정되어 있기 때문에 서버에 ASLR 보호 기법이 적용되어 있어도 PLT로 점프하면 RTL과 비슷한 공격 가능

리턴 주소를 puts@plt+6(0x8048326)으로 바꾸고, 첫 번째 인자를 “ASLR!” 문자열의 주소인 0x8048553으로 바꾸면 puts 함수고 실행되어 “ASLR!” 문자열이 출력된 것을 확인 가능. 하지만 puts 함수가 실행된 후 리턴할 주소가 0x42424242이기 때문에 Segmentation fault 발생.

main 함수에 break point를 설정하고 실행한 후 puts 함수의 GOT인 0x804a00c 메모리 값을 0xdeadbeef로 바꾸면 puts가 호출될 때 puts@got에 저장된 값으로 점프해 eip 레지스터의 값이 0xdeadbeef로 바뀜.

0개의 댓글