vuln.c
포인트
라이브러리
라이브러리란?
다시 사용할 수 있도록 미리 컴파일된 함수들의 묶음
대개 /lib와 /usr/lib에 저장되어 있음
아카이브(정적 라이브러리) : .a 확장자
공유 라이브러리 : .so 확장자
공유 라이브러리란?
동시에 여러 응용프로그램이 동일한 라이브러리 함수를 사용할 경우 사용한다.
실행 시에 사용 가능한 공유 코드를 참조하는 방식으로 공유 라이브러리를 링크시킨다.
필요한 경우 메모리에 로드된다(그래서 library가 heap영역에 존재)
자신을 사용하는 응용프로그램과 독립적으로 갱신될 수 있다.
이 공유 라이브러리의 심볼을 확인해보면
필자의 32bit용 라이브러리는 /lib32내에 있다.
readelf -s /lib32/libc-2.27.so
이렇게 각 함수의 오프셋이 나온다.
함수가 메모리에 로드된 후에 오프셋을 이용하는 방법 중 하나는
base 주소 = 로드된 함수 주소 - 함수 오프셋
read 함수를 예로 들어보자
라이브러리에서 read함수의 오프셋 : 0xe5620
vuln을 실행하면
로드된 read함수의 주소 : 0xf7e36620
로드된 라이브러리의 base 주소 = 0xf7e36620-0xe5620 = 0xf7d51000
이 사실을 이용해서 코드를 작성하면 된다.
정답 1. vuln 내 "/bin/sh" 사용
정답2. 라이브러리 내에 있는 "/bin/sh" 사용