본문 바로가기

Layer7/동아리 숙제

NX-bit binary exploit ( with ASLR )

· 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

https://riemannk.tistory.com/24

 

NX-bit binary exploit

· Buffer Overflow  · 버퍼보다 긴 값을 프로그램의 흐름을 바꾼다. 이 내용은 아래 내용과 서로 연계됩니다. https://riemannk.tistory.com/22 BOF로 쉘따기 · Buffer Overflow  · 버퍼보다 긴 값을 입력..

riemannk.tistory.com

 

목표

1. ASLR 개념 설명

2. Exploit 코드 작성

3. 결과 확인

4. 참고

 

1. ASLR 개념 설명

더보기

ASLR은 그동안 배웠던 고정된 주소를 활용한 BOF 기법들을 한번에 뒤집어 놓는 보호기법이다.

Stack의 주소를 매번 바꾸어 Day7 (간단한 BOF), Day8 (RTL)을 사용할 수 없도록 한다.

위 두 내용을 자세히 보면 " ASLR = False "라는 Exploit코드를 볼 수 있는데 이것을 " ASLR = True "로 바꿀 것이다.

ASLR을 우회하기 위한 기법은 총 2가지가 있다.

둘다 Memory leak을 이용한 기법으로 하나는 FSB, 다른 하나는 ROP이다.

오늘은 그 중 FSB를 해보겠다.

 

2. Exploit 코드 작성

더보기

목표)

1. 라이브러리 베이스 주소 구하기

2. system함수 주소 구하기

3. /bin/sh함수 주소 구하기

4. Shell 획득하기

 

목표를 구하기에 앞서

ASLR = False로 해준다. (기본값 False)

그리고 반드시 기억해야할 사실은 Stack의 주소가 게속해서 변하기 때문에

절대적인 주소가 아닌 상대적인 주소 (Offset)을 구해야 한다.

 

이 사실도 기억하자...

라이브러리 = 함수 + 해당 함수의 Offset

함수 = 해당 함수의 Offset - 라이브러리

 

1. 라이브러리 베이스 주소 구하기

왜 %39$p를 해줄까?

먼저 %p를 입력해보자

이상한 주소값이 뜬다.

그러면 왜 이런 주소값이 뜨는 걸까?

그 이유는 C언어 코드에 있다.

서식문자열이 없는 gets();

gets(buf);라고 써져있다.

하지만 우리는 gets("%d", &args); 로 배웠었다.

그러면 왜 저런 문법이 가능한가?

문자열 포인터

MSDN을 보면 gets()함수는 인자값을 문자열 포인터로 갖는다.

그리고 char buf[0x100];이라고 선언해 주었기 때문에 인자값대신 buf로 대입하는 것이 가능한 것이다.

 

다시 본론으로 돌아와서 %p를 입력하면 gets();함수는 이것을 인자로 생각해 주소값들이 출력된다.

그러면 이 %p를 계속 입력하다 보면 함수 호출 규약에 의해 Stack에 있는 값들이 출력되지 않을까?

실제 rsi(printf), rdi, rcx, rdx, r8, r9, 다음에 나오는 Stack에 있는 값들이 출력되는 것을 확인할 수 있다.

그러면 저 주소들은 무엇을 하는 걸까?

x/10i 명령어로 뭐하는 명령어인지 따라가 보면 확인할 수 있다.

하나씩 따라가 보면 39번째줄에 [__libc_start_main] + 240 이라고 적힌 줄을 찾을 수 있다.

그래서 

라이브러리 주소는 주소의 크기인 14byte를 16진수로 바꾸고, 그 값에다가 [__libc_start_main] + 240을 빼주면 된다.

 

system함수의 Offset은 라이브러리의 system함수의 주소 - 라이브러리의 주소를 하면 

라이브러리 베이스 주소 : 0x00007ffff7a0d000

system 함수의 주소 : 0x7ffff7a523a0

system함수의 Offset : 0x7ffff7a523a0 - 0x00007ffff7a0d000 = 0x453A0

/bin/sh의 Offset = /bin/sh - libc = 0x7ffff7b99e17 - 0x00007ffff7a0d000 = 0x18CE17

 

마지막으로 이 값들을 RTL처럼 Overflow시켜 주면

성공적으로 쉘을 딸 수 있다.

 

3. 참고

더보기

 · C언어 코드

 · Exploit 코드

 

※ P.S : 분량이 점점 짧아 지고 있다고 느낄 수 있는데

          그 이유는 개념 설명이 아닌, 그 개념을 활용하는 방법을 설명하기 때문입니다.

          앞서 개념들을 다 설명했기에 다시 한번 또 설명하는 것은 불필요하다고 느꼈습니다.

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

운영체제의 메모리 할당 알고리즘  (0) 2020.09.02
Codegate 2018 BaskinRobins31  (0) 2020.09.02
NX-bit binary exploit  (0) 2020.08.25
rev-basic-1 (선택 과제)  (0) 2020.08.20
BOF로 쉘따기  (0) 2020.08.16