대부분 버퍼오버플로우를 일으키고 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 부분에 작성해준다.
아래처럼 말이다!!!
'pwnable > 기본개념, 사용관련 끄적끄적' 카테고리의 다른 글
peda에서 개꿀팁 (2) | 2017.03.31 |
---|---|
rop를 위한 objdump 옵션들 확인 (0) | 2017.01.22 |
pop pop ret 헷갈리지 않기 (0) | 2017.01.22 |
보호기법 끄는 컴파일 옵션 (0) | 2017.01.20 |
xinetd 사용해보기! (0) | 2017.01.20 |