감자 텃밭

[시스템] libc-Database 본문

System/System Theory Information

[시스템] libc-Database

g2h 2021. 11. 21. 00:58

libc-Database란 보통 시스템해킹(포너블)을 할때 사용하는 유틸리티 프로그램이며,

glibc 라이브러리 버전별로 원하는 함수의 주소(offset)를 저장하고 있는 데이터베이스이다.

 

주로 포너블을 할경우 제공되는 바이너리파일에는 ASLR 메모리 보호기법이 적용되어있다.

이 경우 함수의 주소값을 찾기 힘들며, 변경되는 주소의 오차 범위도 크다.

 

이럴 경우 libc-Database 를 사용하면 편리하게 주소값을 찾을 수 있다.

 

보통 리눅스자체에 립시 파일이 존재하지만 해당 리눅스 버전별로 립시파일에 있는 주소는 모두 다르다.

 

아래 사진을 보면 확인이 가능하듯

특정 바이너리파일을 실행시키면 linker되어 있는 libc파일은 base주소를 정해둔다.

마지막 1.5바이트는 000으로 맞추고 나머지 값들을 랜덤값으로 맞춰 놓는다.

libc 파일 내에 존재하는 함수는 랜덤주소 + offset만큼 떨어져서 존재하며 offset값은 고정이다.

즉 특정함수를 예를 들어 system 함수의 offset값을 알고 libc가 바이너리에 위치한 주소(base)주소를 알면 

libc(base)주소 + offset만큼 더해서 libc내의 실제 함수주소를 얻을 수 있다.

 

다시말해 libc버전별로 offset값을 저장하고 있는 database가 libc-Database이다.

 

특정 공격코드에서 함수를 호출할때 ASLR 보호기법이 적용되어있으면

libc-Database 를 이용하여 함수의 실제 주소를 얻어올 수 있다.

 

특정 함수의 실제 주소를 찾고 offset값을 빼주면, libc_base 주소를 알 수 있게 된다.

 

예를 들어 출력함수의 plt를 사용하여 특정 함수의 got 주소값을 출력시켜 해당 출력된

실제주소(got) - 특정함수의 offset 주소를 하면 = libc-base 주소를 얻게된다

이렇게 해서 얻은 libc-base + 원하는 함수의 offset 값을하게되면 원하는 함수의 실제 주소를 얻게되는것이다.

 

[정리]

libc_base = 특정 함수의 실제주소 - offset 

원하는 함수의 실제 주소 = libc_base + 원하는 함수의 offset

참고자료
https://kaspyx.tistory.com/86

 

※ 내용이 이상하거나 문제가 있을경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.