document.onkeypress = getKey;

대부분 버퍼오버플로우를 일으키고 RET 주소를 덮을 때

아무 일도 일으키지 말라는 Nop Sled와 권한 상승(privilege escalation)을 위해 사용되는 쉘코드가 있는 주소를 주입시켜준다.


이때 이 Nop Sled와 쉘코드를 어디다가 저장해둘까? 에 대한 방법이다.


exploit의 종류 중 가장 기본적이고 쉬운 환경변수를 통한 공격 방법을 설명해주겠다.



환경변수를 통한 공격은 "에그쉘"이라고 불린다.


FTZ 11번 문제를 예시로 설명해주겠다.


 


버퍼오버플로우를 일으킬 수 있는 취약한 함수인 strcpy 함수를 확인해 보자.

길이를 체크하지 않고 copy 하는 함수이기 때문에 우리가 조금만 더 작성하면 RET 값을 덮어버릴 수 있다.


우리는 환경변수 안에다가 쉘코드를 저장해둘꺼고, 나중에 RET 주소에다가 이 쉘코드를 저장한 환경변수의 위치를 작성해 줄 것이다.


그러니 일단 환경변수에 쉘코드를 저장해보자...!!

리눅스에서 환경변수 설정은 이렇게 한다.



export 변수명=`python -c 'print "\x90"*100+"쉘코드"

(여기서 변수명뒤=을 붙여쓰라)



그럼 이 환경변수가 저장된 위치를 알려주는 프로그램을 짜야한다.

c언어의 getenv 함수를 이용하면 된다!

getenv.c 를 짜서 gcc -o getenv getenv.c 명령어를 통해 컴파일 해준다.

첫번째 인자에 환경변수명을 넣어주면 그게 저장된 위치를 알려준다.


이런식으로

이제 우리는 이 주소를 그냥 RET 주소에다가 덮어 주면 된다.

물론 Little Endian으로!!


버퍼크기(256) + 더미갯수 (8) + SFP (4) + RET (4)        <이부분은 gdb로 까봐야 안다! 필자는 생략한다>

이므로 버퍼+더미+SFP 까지 268개를 덮은 후 우리의 쉘코드가 있는 주소를 RET 부분에 작성해준다.


아래처럼 말이다!!!







+ Recent posts