LibC - WindyHana's Solanara

목차

libc.so

libc.so 마운트와 해제

root@wl ~ # df -k
/usr/lib/libc/libc_hwcap1.so.1
                     50423874 7450881 42468755    15%    /lib/libc.so.1
root@wl ~ # ls -al /usr/lib/libc/libc_hwcap1.so.1 /lib/libc.so.1 1)
-rwxr-xr-x   1 root     bin      1087992  9월 18일  02:00 /lib/libc.so.1
-rwxr-xr-x   1 root     bin      1087992  9월 18일  02:00 /usr/lib/libc/libc_hwcap1.so.1
root@wl ~ # digest -a md5 /usr/lib/libc/libc_hwcap1.so.1
30fc278a5f38f9141be68b1d83ae70f0
root@wl ~ # digest -a md5 /lib/libc.so.1
30fc278a5f38f9141be68b1d83ae70f0
root@wl ~ # umount /lib/libc.so.1 2)
root@wl ~ # ls -al /usr/lib/libc/libc_hwcap1.so.1 /lib/libc.so.1 3)
-rwxr-xr-x   1 root     bin      1083760  9월 18일  01:59 /lib/libc.so.1
-rwxr-xr-x   1 root     bin      1087992  9월 18일  02:00 /usr/lib/libc/libc_hwcap1.so.1
root@wl ~ # mount -O -F lofs /usr/lib/libc/libc_hwcap1.so.1 /lib/libc.so.1 4)
1) 두 파일이 같은 파일임을 알 수 있다. 시스템에 따라 /usr/lib/libc/libc_hwcap2.so.1 와 연결되어있을 수 있다. 그렇다면 이 예제에서는 파라메터를 바꿔서 시험해봐야 한다.
2) 마운트를 해제한다.
3) 두 파일이 다른 파일임을 알 수 있다. 파일 용량부터 차이난다. 원래 있는 파일을 지우지 않기 위해 lofs를 이용해 마운트한 것이다.
4) 다시 원래대로 복구한다.
※ lofs로 마운트 해서 마운트 한것 처럼 보이지만, 실제로는 그냥 파일이다.

0@0.so.1

솔라리스에서는 널 포인터를 참조하면 세그먼트 폴트가 일어난다.
libc_0.c
 다운로드 (276 바이트)
/*
	/usr/lib/0@0.so.1
	WindyHana's Solanara http://www.solanara.net/
	cc -o libc_0 libc_0.c
	LD_PRELOAD=/usr/lib/0@0.so.1 ./libc_0
*/
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
	char* str = NULL;
	printf("NULL String: %s\n", str);
	return 0;
}
root@wl ~/src # cc -g -o libc_0 libc_0.c
root@wl ~/src # ./libc_0
세그멘테이션 결함(Segmentation Fault) (core dumped)
139 root@wl ~/src # dbx libc_0 core
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.9' in your .dbxrc
Reading libc_0
core file header read successfully
Reading ld.so.1
Reading libc.so.1
program terminated by signal SEGV (no mapping at the fault address)
0xfee663dc: strlen+0x000c:      movl     (%eax),%edx
Current function is main
   12           printf("NULL String: %s\n", str);
(dbx) examine str
0x00000000:     dbx: core file read error: address 0 not in data space
(dbx) exit
소스를 수정하는 것이 가장 좋지만, 여의치 않을 경우 0@0.so.1 을 미리 로드 시켜 실행시켜 주면 된다. 하지만 이렇게 하면 몇가지 솔라리스 툴을 사용하는데 있어 제약이 따른다. 예를 들어 truss를 실행시킬 수 없다.
root@wl ~/src # export LD_PRELOAD=/usr/lib/0\@0.so.1
root@wl ~/src # ./libc_0
NULL String:
root@wl ~/src # truss ./libc_0
ld.so.1: truss: 치명적: /usr/lib/0@0.so.1: 잘못된 ELF 클래스: ELFCLASS32
중단됨(Killed)
Twitter RSS IconTexto 올바른 XHTML 1.0 Transitional 입니다 올바른 CSS입니다!