plt - 어떠한 함수들이 있는지 나열되어 있는 테이블
사용자가 만든 함수는plt를 참조할 필요가 없지만 외부 라이브러리에서 가져다가 사용할 경우에는 plt를 참조하게 됩니다

got - 함수들의 주소를 담고 있는 테이블
라이브러리에서 함수를 호출할 때 plt가 got를 참조합니다 .

gdb로 까봣을때 함수 뒤에 plt가 들어가있으면 외부 라이브러리에서 가져온 함수

함수 뒤에 plt가 존재하지않는다면 사용자가 만든 함수 

[gdb로 plt가 붙은 함수가 jmp 하는곳을 x/i 주소 명령어를 통해 확인해보면 got가 있는곳으로 jmp하는 것을 알 수 있다

got에는 함수의 실제 주소를 가리키는것이 아니라 plt+6의 주소를 가리킨다 
이 이유를 이해하기 위해서는 아래 과정을 알아야 한다.

함수를 실행하기 전 

plt address -> got address (jmp plt +6) -> jmp global_offset_table -> _dl_runtime_resolve -> _dl_fixup -> _dl_lookup_symbol_x -> jmp function address

    함수_got -----------------------------------> 함수 실제 주소 


함수를 실행한 후 

plt address -> got address -> jmp function address

이 부분은 https://bpsecblog.wordpress.com/2016/03/09/about_got_plt_2/< 참고 해주세요 

rtl 기법으로는 

DEP와 NX bit가 적용된 스택을 우회하기 위해서 주로 사용됩니다

DEP - 데이터 실행 방지로 스택이나 힙에서의 쉘 코드 실행을 막아주는 보호기법입니다!

NX bit - NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되고 프로세서 명령어가 그 곳에 상주하지 않음으로써 실행되지 않도록 만들어 준다 .
(only 데이터 저장 , 실행x )

RTL chain 

ret로 특정한 함수를 호출하면 (인자 값이 하나인 함수일 경우에) 스태ㅐㄱ의 맨위가 pop ret 주소가 리턴어드레스가 되고 parameter 1이 인자값이된다 그리고 또 ret에 특정 함수를 넣으면 .,..반복 

/-----------/
|   ret1   |
/-----------/
| pop ret |
/-----------/
|  인자1  |
/-----------/
|   ret2   |
/-----------/ 반복 --------

이럴 경우 buf +sfp +ret+"dummy"+parameter 에서 dummy 부분에 exit를 써주는게 안전하다! 


ASLR 이란 ? 
동적 라이브러리의 주소를 프로그램 실행마다 랜덤하게 매핑한다 .
주소값이 프로그램 실행마다 매번 바뀌면 RTL을 위해 System() 함수의 주소를 구하고 싶어도 구하기가 하늘의 별따기입니다 

그러면 이 문제를 어떻게 해결하나 ? 
코어 덤프 할때 쓰던 명령어와 비슷한 명령어를 사용해줍니다
ulimit -s unlimited
ulimit      = 시스템 제한
-s          = 최대 스택 크기 출력
unlimited = 크기에 제한을 두지 않는다.

스택이 더 이상 증가하지 못 할 정도로 증가시켜서 랜덤으로 매핑되게 하는 ASLR기법을 방지합니다

코드영역에는 스택, 힙과는 다르게 고정된 값이 박혀있습니다 

코드영역 0x8048000을 열어본 후 쉽게 아스키코드로 쉽게 파악할 수 있는 값
ex) A - 41을 system 의 인자로 사용합니다 

cp /bin/sh ./A 이러한식으로 /bin/sh를 ./A라는 이름을 가진 실행파일에 복사해서 쉘이 실행되도록 만든 후 export PATH=.:$PATH 를 이용해서 환경변수에 현재 위치를 등록합니다 

그 후 

buf + sfp + &system + dummy + 0x41가 들어있는 주소 를 넣으면 

system("A")가 실행되고 쉘이 실행됩니다 

저도 공부중이라서 뒤죽박죽 정리했습니다 

+ Recent posts