리눅스 환경에서
- 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 |