본문 바로가기

Layer7/동아리 숙제

NX-bit binary exploit

· Buffer Overflow

   · 버퍼보다 긴 값을 프로그램의 흐름을 바꾼다.

 

이 내용은 아래 내용과 서로 연계됩니다.

https://riemannk.tistory.com/22

 

BOF로 쉘따기

· Buffer Overflow  · 버퍼보다 긴 값을 입력해서 쉘 코드를 입력받는다. · C언어 코드 #include void setup() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); setvbuf(stderr, 0, 2, 0); } int main..

riemannk.tistory.com

 

목표

1. 프로그램 분석

2. RTL 개념 설명

3. Exploit 코드 작성

4. 결과 확인

5. 시행착오

6. 참고

 

1. 프로그램 분석

더보기

1) 값을 입력 받는다. // BOF

2) 출력한다. // FSB

3) 값을 입력 받는다. // BOF

 

1) NX 보호기법 작동중

2) Day7에서 했던 간단한 BOF적용 X

3) NX 보호기법을 우회하는 RTL필요

 

3. RTL 개념 설명

더보기

Exploit 코드 작성에 앞서 RTL이란 무엇인지 개념설명을 해보겠다.

RTL이란

Day7때 우리는 간단한 BOF를 통해 Stack을 이용해서 Shell을 땄었다.

그런데 이를 방지하기 위해 Stack에 실행 권한을 없애버린 RX라는 새로운 보호기법이 등장했고,

다시 우리는 이 RX라는 보호기법을 우회하기 위해 Stack이 아닌, 라이브러리함수를 이용해 Shell을 실행시키는

RTL을 해볼 것이다.

4. Exploit 코드 작성

더보기

큰틀은 Day7과 같다.

수정할 부분은 payload,

앞서 말했듯이 우리는 Stack이 아닌, 라이브러리함수를 통해 Shell을 실행시킬 것이다.

즉, 우리의 목표는 system("/bin/sh"); 명령어를 날리는 것이다.

(execve함수 사용 (system함수가 내부적으로 사용하는 함수))

(비슷한 단어 syscall : 라이브러리함수에 있는 기능으로 scanf(), printf()등과 같은 함수들이 사용한다.)

따라서 payload의 가장 첫번째 값은 /bin/sh\00이다. \00을 쓰는 이유는 문장의 끝(NULL: 공백)을 알리기 위해서이다. 이러면 뒤에 있는 AAAA...값을 읽지 않고 끝낸다.

그 다음으로는 Stack의 SFP까지 A를 채워주고, = "A" * (0x108 - len(payload))

Stack의 RET값에는 인자값(rdi(by 함수호출규약):가젯의 주소)을 넣어준다. = p64(0x4007e3)

pop rdi ; ret : rdi값을 stack에서 빼주고(사용) ret해준다. = rdi를 인자로 사용해준다.

그런다음 버퍼주소를 넣어주어서 rdi값에 "/bin/sh"를 대입해준다. = p64(0x7fffffffe380)

0x7fffffffe360 : RAX-30

그후, system의 함수 시작주소를 넣어

system함수를 "/bin/sh"라는 인자로 실행시켜준다. = p64(0x155554fa9390)

마지막으로 작성한 payload를 입력해주면 Exploit의 코드는 끝이난다.

총정리 : 결론

5. 결과 확인

6. 시행착오

더보기
attach 불가

우선 시작부터 attach를 못하는 경우가 벌어졌다.

코드를 다시 작성해보고, 문자열을 .c코드에서 직접 복붙했는데도 문제가 해결되지 않았다.

원인은 아직도 잘 모르겠으나, 문자열을 입력받을때 최대한 간결하게 하기 위해서 ": "으로 바꾸어 주었더니 해결되었다.

(숨겨진 유니코드가 있다는게 유력한 학설)

아름다운 5시간...

이 시행착오가 가장 힘들었다. (resolved by 친구 도움)

RTL이 잘 몰라 인터넷을 뒤져가면서 열심히 Exploit코드를 짰었는데, 에러가 발생했다.

그래서 더 열심히 뒤져가면서 Shell을 딸려고 노력했지만, 결국 포기했다.

친구에게 도움을 청하니 원인은 저 코드가 32bit에서만 작동한다는 것이였다. (운영체제: Ubuntu 64-bit 16.04 LTS)

("A" * 0x104에서 의심을 했어어야 했다. *64bit: 8byte, 32bit: 4byte ∴SFP 32bit/64bit : 4/8)

7. 참고

더보기

C언어 코드

 

Exploit 코드

 

제 이해에 도움을 주신 친구 허린님께 최대한의 감사를 표합니다.╰(*°▽°*)╯

'Layer7 > 동아리 숙제' 카테고리의 다른 글

Codegate 2018 BaskinRobins31  (0) 2020.09.02
NX-bit binary exploit ( with ASLR )  (0) 2020.08.28
rev-basic-1 (선택 과제)  (0) 2020.08.20
BOF로 쉘따기  (0) 2020.08.16
Dreamhack 공부 내용 정리 및 문제풀이 (Reversing)  (0) 2020.08.07