System - Return To Library
0x0300 : Study/0x0301 : SystemPLG ? GOT?
Plt (Procedure linkage table)
사용자가 만든 함수는 plt를 참조할 필요가 없지만 외부 라이브러리에서 가져다 쓸 경우 plt 를 참조 하게 된다.
got (global offset table)
함수들의 주소를 담고 있는 테이블이다. 라이브러리에서 함수를 호출할 때 plt가 got를 참조한다.
즉 외부 라이브러리에서 함수를 참조할 때? plt에서 got로 넘어가고 got는 실제 라이브러리 함수주소가 들어있다.
got overwrite라는 기법이 plt, got의 동작 과정에서 고안해낸 기법이다. got는 실제 함수의 주소를 가리켜서 그곳을 실행 하기 때문에
got에 우리가 원하는 주소로 덮어버리면 특정 함수가 실행되지 않고 우리가 원하는 주소가 실행된다.
plt (Procedure linkage table)
gdb를 통해 디버깅을 해보면..
fflush@plt
fget@plt
puts@plt
처럼 외부 라이브러리가 있는 것을 확인 할 수 있다.
그 밖에도 사용자가 만든 procedure들도 확인 할 수 있는데...예시가 없어 확인 해줄 방도가..
got (global offset table)
// 뭐라 설명하기 힘든데...공부한 블로그 자료 보는게 좋을듯 ..
// 주소는 아래에 !
즉.
함수 실행전>>
plt 주소 > got 주소 (JMP plt + 6) > jmp got > dl_runtime_resolve > dl_fixup > dl_lookup_symbol > jmp function address
함수 실행후>>
plt 주소 > got 주소 > jum function address
Return To Library
:: 공유 라이브러리에 있는 함수의 주소를 이용해서 바이너리에 존재하지 않는 함수를 사용 할 수 있다.
DEP (Data Execution Prevention) 메모리 보호기법 우회.
:: 데이터 실행방지로 스택이나 힙에서 쉘 코드를 실행방지를 해주는 메모리 보호 기법.
NX bit (Never Execution Bit) 가 적용된 스택을 우회하기 위해 사용.
:: NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되며, 프로세서 명령어가 그 곳에서 상주 하지 않음으로써 실행되지 않도록 만들어 준다.
본문에서 사용된 예시이다.
// 커피하고 2진법 저거는 무시..
이 코딩을 보면 strcpy라는 함수구문에 libc_start_main대신 system을 실행 하고자 한다.
// system("bin/sh")을 실행 시키는 것이 목표.
먼저 저 코드의 스택 구조를 살펴보면
buf[128] |
sfp[4] |
ret[4] |
dummy[4] |
parameter[1] |
이러한 구조로 나타나 있다.
// 이 또한 gdb를 통해 구조를 파악. 사실 굳이 안해도 이정돈 구상 해야되는듯...?
우린 저 구조에서 ret[4]를 ..
ret [4] |
>> |
libc.so.6 |
|
|
system() |
처럼 변환 하여 sh을 실행 시키고자한다.
// 왜 이렇게 되는지는 bof하면서 아니깐 pass...궁금하면 원문 링크 .
buf [128] + sfp 값 + return 값 + "AAAA" + parmeter 를 넣어서 실행 시키면?
eip에 0x41414141 이라는 값이 입력 되어있을 것이다...이 곳으로 bof? 이론처럼 하면 되는듯..?
-----
ASLR (Address Space Layout Randomization)
:: 동적 라이브러리의 주소를 프로그램 실행마다 매핑!
ulimit -s unlimited를 이용하면 스택이 더이상 증가하지 않고 랜덤으로 매핑이 되는 것을 방지 할 수 있다.
// ulimit > 시스템 제한 , -s > 최대 스택 크기 출력 , unlimited > 크기제한 해제.
// 리눅스 상위 버전이나 대부분인거 같은데... aslr이 걸려있다는 거 같다..
-----
다시 돌아와서 ..
시스템 주소값과 파라미터 주소 값을 알게 되어 sh 를 실행 시키면 되는데...
원문에서는 export PATH를 이용해 환경변수에 시스템 출력 하는 것을 지정하였다.
// export PATH=.:$PATH > 환경변수에 현재 위치( . )를 등록..
페이로드를 작성하면...
buf [128] + sfp [4] + 0x4007b190 (시스템 주소값) + dummy [4] + 0x44가 들어 있는 주소.
// 0x44값을 지우고 쉘 코드를 넣어서 해도 될듯 하다...
// 사용된 주소값은 원문에서 쓰인 값이다.
" 출처 : http://shayete.tistory.com/ "
'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글
System - Format String Attack 1 (0) | 2016.08.05 |
---|---|
생각난김에 쓴 심볼릭 링크 (0) | 2016.07.19 |
System - Assembly Handray (0) | 2016.06.12 |
System - stack? gdb? (0) | 2016.06.12 |
System - 시스템해킹이란? (0) | 2016.06.12 |