본문 바로가기
정보보안/시스템 해킹

Stack Buffer Overflow

by dustnn 2024. 11. 25.

 

리눅스 환경에서

 

- pwndbg 설치

터미널에 다음과 같이 입력하면 설치된다. 버전은 최신 pwndbg 버전을 입력하면 된다.

$apt install ./pwndbg_2023.07.17_amd64.deb

 

 

하지만 이렇게 에러가 뜬다면 github clone 바로 사용하기 위해 다음과 같이 입력하면 된다.

git clone https://github.com/pwndbg/pwndbg

 

 

- pwntools 설치

 

$apt-get update
$apt-get install python3 python3-pip python-dev git libssl-dev libffl-dev build-essential
$python3 -m pip install --upgrade pip
$python3 -m pip install --upgrade pwntools

 

 

Stack Buffer Overflow

 

 

시스템 해킹은 한 번 발생하면 되돌리기 굉장히 어렵다.

 

스택 프레임 영역을 할당하기 위해 prologue와 epilogue 수행

 

 

Prologue

: 함수 호출되었을 때 스택을 정리하는 방식 => 모든 함수 동일

 

Push rbp //rbp의 현재 주소를 스택에 밀어넣기
Mov rbp, rsp //rsp(스택의 상단 주소)를 rbp로 옮기기 => 현재 함수의 stack base 설정

 

 

 

 

 

 

Epilogue

: 함수의 수행을 마치고 처음 호출한 지점으로 돌아가기 위해 스택을 복원하는 과정

 

 

 

 

 


Stack Overflow: stack 영역의 메모리가 지정된 범위를 넘어갈 때 오버플로우

Buffer Overflow: buffer의 용량보다 더 큰 입력값이 들어와 오버플로우

 

 

 

 

 

취약점 분석

 

취약점은 25번줄에 있다.

scanf("%s", buf);

 

scanf 함수는 포맷스트링 함수로 입력 길이를 제한하지 않기 때문에 버퍼보다 큰 데이터를 입력하면 버퍼오버플로우가 발생한다.

 

크기가 0x28인 버퍼에 입력받기 때문에 0x28바이트 이상의 데이터가 입력된다면 main함수를 덮어쓰는 버퍼오버플로우가 발생한다.

 

Dreamhack

 

- welcome

 

서버에 접속하여 포너블 주소 복사하여 터미널에 붙여넣으면 플래그값을 획득할 수 있다.

 

 

- return address overwrite

(시나리오)

RET(반환주소)를 get_shell()로 덮어씌우기 -> 권한 탈취

 

rao.c 코드는 다음과 같다.

 

취약점

scanf("%s", buf)

 

트리거

 

gcc -o rao rao.c -fno-stack-protector -no-pie

 

 

 

RET에 get_shell() 덮어씌움

 

print get_shell

print get_shell 해서 나온 주소를 payload에 붙여 쓰면 된다.

 

 

 

 

- baby-bof

 

<baby-bof.c>

 

취약점

scanf("%15s", name)

 

15글자를 입력받고 있기 때문에 다음과 같이 15글자를 입력해보면

 

다음과 같이 아무 hex value와 개수를 입력하면 다음과 같이 입력한 개수만큼 입력한 hex value로 덮어씌워진다.

 

다시 돌아와서

 

 

목표는 win()함수로 RET인 "7ffe4395ae40" 를 덮어씌우는 것이므로

win()함수의 주소인 0x40125b를 hex value에 입력하고 main함수 리턴값 부분까지 덮어씌워주면 된다.

 

 

 

-awesome-basics

 

 

 

 

 

'정보보안 > 시스템 해킹' 카테고리의 다른 글

Dreamhack_Assembly Quiz  (0) 2024.11.25
Stack Canary  (0) 2024.11.25