공룡호가 사는 세상 이야기

종종 어플리케이션들은 시작할때 솔라리스의 버전을 체크 합니다. 필자는 최근에 그러한 어플리케이션을 설치 하였습니다. 어플리케이션이 솔라리스의 구버전에서만 인증되었는지에 대해서는 알 수 없었습니다. 또한, 어플리케이션의 인스톨러는 OS 의 버전을 확인할 만큼 훌륭하지 않았었습니다!

그러므로 결국 저는 제 시간을 낭비한 걸까요? 아닙니다! 'dtrace' 가 저를 구원해 주었습니다. 필자는 dtrace 스크립트를 이용하였습니다.

1.실행 파일을 'fubar' 라고 가정해 봅시다. fubar 가 어떻게 솔라리스 버전을 가져오는지를 살펴 봅시다. 결과를 통해서 uname() 시스템 콜임을 알았습니다.

$ truss ./fubar 2>&1 | grep uname
uname(0xFFBFF898)                               = 1

2.'fubar' 가 기대하고 있는 솔라리스 버전을 살펴 봅시다.
$ strings fubar | grep 'SunOS '
SunOS 5.5.1
SunOS 5.6
SunOS 5.7
SunOS 5.8
SunOS 5.7 Generic_106541-05 sun4u

필자가 이것을 이전에 알았다면 아마 솔라리스8 마이그레이션 지원 환경에 설치하였을 것입니다.

3.아래가 'fubar' 를 속이기 위한 dtrace 스크립트 입니다. 'fubar' 는 오직 "SunOS" 와 "5.5.1" 만을 신경 씁니다. 그러므로 솔라리스가 1986년도에 8086에서 돌아가는 것이라도 상관 없습니다.
$ cat unameSol8.d
#!/usr/sbin/dtrace -s
#pragma D option destructive
syscall::uname:entry
/execname == "fubar"/
{
        self->addr = arg0;
}

syscall::uname:return
/execname == "fubar"/
{
        copyoutstr("SunOS", self->addr, 257);
        copyoutstr("PowerPC", self->addr+257, 257);
        copyoutstr("5.5.1", self->addr+(257*2), 257);
        copyoutstr("gate:1996-12-01", self->addr+(257*3), 257);
        copyoutstr("PPC", self->addr+(257*4), 257);
}


필자:
Katsumi Inoue

이 글의 영문 원본은
Spoofing Solaris version using dtrace
에서 보실 수 있습니다.