BOF(Buffer Overflow)란? 

 

연속된 메모리 공간을 사용하는 프로그램에서 할당된 메로리의 범위를 넘어선 위치에 자료를 읽거나 쓰려고 할 때 발생.

 

영향도

 

버퍼 오버플로우가 발생하게 되면 프로그램 오작동을 유발시키거나, 악의적인 코드를 실행함으로써 공격자가 프로그램을 통제할 수 있는 권한을  획득하게 됨.

 

종류

스택(Stack) 버퍼 오버플로우

 

스택 영역 : 함수 처리를 위해 지역변수 및 매개변수가 위치하는 메모리 영역.

- 스택에 할당된 버퍼들이 문자열 계산 등에 의해 정의된 버퍼의 한계치를 넘는 경우 버퍼 오버플로우가 발생하여 복귀 주소(Return Address)를 변경하고 공격자가 원하는 임의 코드 실행

 

힙(Heap) 버퍼 오버플로우

 

힙 영역: 힙은 사용자가 동적으로 할당하는 메모리 영역(malloc()등의 메모리 할당 함수 이용).

- 힙에 할당된 버퍼들에 문자열 등이 저장되어질 때, 최초 정의된 힙의 메모리 사이즈를 초과하여 문자열 등이 저장되는 경우 버퍼 오버플로우 발생, 데이터와 함수 주소 등을 변경하여 공격자가 원하는 임의 코드를 실행.

 

4. 실습 진행

 

실습 환경은 버퍼오버플로우가 가능한 웹 페이지에서 공격을 시도해 보겠습니다.

 

HINT라는 곳을 보면 

 

\x90*354 + \x8f\x92\x04\x08 + [payload]로 이루어져 있습니다.

 

이것의 의미는 버퍼가 354개 를 넘어설 경우, \x8f\x92\x04\x08 이 덮어 씌워지게 되고 이후에 [payload]를 가리키게 됩니다.

 

여기서 \x8f\x92\x04\x08을 설명드리자면, jmpESP라는 것입니다.

jmpESP는 스택의 제일 윗부분을 가리키는 것입니다.

 

이후 페이로드가 실행되게 되는 구조입니다.

 

공격 = 버퍼를 354개를 넘어 선 후 jmpESP를 통해 공격 구문이 실행되도록 하는 것입니다.

 

위의 화면이 어떻게 구성되었는지 소스코드 확인해보겠습니다.

표시해둔 박스 안을 보면 타이틀이 없을 경우 Please enter a title을 출력해 주며 그 외에는./apps/movie_search를 통해 쉘 코드가 실행되는 것을 볼 수 있습니다.

 

이제 msconsole을 통해 공격 구문 작성해보도록 하겠습니다.

 

msfdb init을 통해 구동을 시켜줍니다.

 

이후 msfconsole을 통해 페이로드 작성해보도록 하겠습니다.

 

use linux /x86/exec

set cmd /bin/ps

위의 명령어를 통해 공격 시 원하는 명령어를 넣어 줍니다. 저는 현재 실행 중인 프로세스를 띄우는 명령어를 공격 페이로드에 넣어주었습니다.

 

이후 공격 구문을 만들 기 위해 generate 명령을 사용했습니다.

버전마다 사용되는 옵션이 다르기에 확인 후 옵션 적용해주시면 됩니다.

generate -b '\x00' -e x86/opt_sub -f raw -o /tmp/payload.txt

 

-b 옵션의 경우 사용하지 않을 characters를 설정해 주며, -e 옵션을 통해 인코딩 방식을 적용하였습니다.

-f을 통해 파일 형식을 지정해 주고 -o 옵션을 통해 저장할 파일 경로와 파일명을 설정해 주었습니다.

 

이후 payload.txt 파일이 생성되었습니다.

 

해당 파일을 열어보니 공격 구문이 생성된 것을 확인할 수 있었습니다.(내용은 인코딩 되어 비정상적으로 보임)

 

{ echo -n \'; cat /tmp/payload.txt; echo -n \'; } | perl -pe's/(.)/sprintf("%%%02X", ord($1))/seg'

이후 msfconsole을 exit을 통해 빠져나온 후 공격 파일의 내용을 출력해보았습니다.

 

해당 공격 구문을 파이썬을 통해 처음 354의 크기의 버퍼를 넘으며 jmpesp 및 쉘 코드를 수정 가능하도록 페이로드를 짜 보겠습니다.

 

파이썬 코드를 작성해 주시는데 dummy를 통해 버퍼의 크기를 넘게 할 것이며, jmpesp를 설정한 shellcode 안으로 들어올 수 있도록 할 것입니다.

shellcode [:3]을 통해 %27(' 싱글 쿼터를 의미)을 dummy 앞으로 빼주어 ' + dummy +jmesp + '(shellcode [3:]의 마지막 값이 %27 이기에 '싱글 쿼트가 들어감)  형식으로 만들어 주는 공격 구문입니다.

 

이후 파이썬 실행 시 공격 구문이 작성되게 됩니다. 해당 내용을 BOF에 취약한 곳에 적용해보겠습니다.

 

이제 초기의 movie search 버튼을 클릭 시 타이틀 파라미터 값에 해당 파이썬에서 나온 공격 구문을 넣어주면 

응답 값에 현재 실행되는 프로세스 상황을 알 수 있습니다.

 

실습 끄읏~

 

처음 시도해 본 공격이라 다소 시간도 걸리고 버전마다 사용되는 옵션들이 달라서 캡처를 구간구간 찍게 되었습니다.

위의 순서대로 진행한다면 무리 없이 따라 하실 수 있습니다.

 

조금 부족한 부분은 수정할 예정입니다.

 

해결방안, 명령 설명 등. 

'기술보안 > System' 카테고리의 다른 글

[pwn.college] Assembly Crash Course - Level 2  (0) 2023.10.01
[pwn.college] Assembly Crash Course - Level 1  (0) 2023.09.20
리버싱 기초(EQST LMS)  (0) 2022.12.30
Apache 보안설정 (2)  (0) 2021.03.28
Apache 보안설정 (1)  (0) 2021.02.21
복사했습니다!