[SSS] Control Flow Hijacking - Buffer Overflow
Buffer Overflow 공격을 위해서 컴퓨터 아키텍처를 알아야 한다.
32bit / 64bit/ ARM / Intel / AT&T 등 여러 가지 아키텍처가 있는데.. 어차피 하나만 잘 볼 수 있으면 다른것도 잘 본다.
x86은 스택의 Base Pointer를 사용하고 ARM은 Stack Pointer만 사용하고.. 이런식으로 차이가 조금씩 있긴 하지만 필요할 때 찾아보면 됨
MOV EAX 등 기본 어셈블리 명령어, 빅엔디안 / 리틀엔디안 등 데이터 표현법, 데이터의 저장 위치 등은 시스템프로그래밍과 운영체제에서 공부했다.


32bit 기반 리눅스 운영체제에서 스택의 최상위 1GB는 OS 영역으로 할당되고 나머지 3GB가 사용자 영역으로 할당된다.
스택은 컴파일 시 크기를 잡아둘 수 있고, 힙은 동적으로 크기를 잡아놓을 수 없다.
함수 A에서 함수 B를 호출할 때 함수의 파라미터와 반환 주소를 저장하고 B에 대한 스택 메모리를 할당한다.
Saved EBP에는 함수 A의 EBP값을 저장해 나중에 복귀할 때 사용한다.

Buffer Overflow는 데이터가 버퍼를 넘어 다른 변수에도 쓰이는 버그를 의미한다.
Return Address가 저장되는 공간에 Overwrite 한다면 프로그램이 의도한 대로 실행되지 않고, 이 공격을 Control Flow Hijacking이라고 부른다.
<pwnable.kr - bof>

ssh 로 pwnable.kr에 들어가자. 사람 많아서 할당할 쉘이 없으면 접속이 안 되는듯.. 접속 안되면 사람 없을때 해보자.
bof의 실제 실행은 bof_pwn 권한으로 nc 0 9000으로 서비스된다.

main 함수는 func를 호출하고 이 때 인자로 0xdeadbeef를 전달한다.
func 함수에서 key 값이 0xcafebabe일 때 쉘을 얻을 수 있는데, gets함수는 사용자가 입력한 문자열의 개수를 검증하지 않는다.
즉, overflowme 배열의 크기는 32byte지만 gets 함수는 그 이상을 입력받을 수 있다.
gets함수의 취약점을 이용해 key를 0xcafebabe로 덮어쓰고 플래그를 획득해보자.
그러기 위해 key 값이 저장되어있는 위치와 입력 배열인 overflowme의 위치를 알아야 한다.


main 에서는 func를 호출하고 있다. dissasemble func 함수로 두 변수의 위치를 확인해보자.
+55에서 gets 함수를 호출하고, +63에서 ebp+0x8과 0xcafebebe를 비교하고 있다. 즉, ebp+0x8이 인자로 전달받은 key이다.
+51에서는 ebp-0x2c 값을 eax레지스터에 저장하고 있다. eax레지스터는 함수의 반환값을 저장하니 eax에 gets의 반환값이 들어간다.
주소 ↑
[ caller ... ]
[ key (4) ] <-- ebp + 0x08
[ return addr (4) ] <-- ebp + 0x04
[ saved EBP (4) ] <-- ebp
[ overflowme (44) ] <-- ebp - 0x2c
[ ... lower stack ...]
주소 ↓
overflowme 의 주소 - ebp-0x2c
key의 주소 - ebp+0x8
그러니 입력값으로 0x34 byte의 더미 입력과 cafebabe를 입력하면 쉘을 얻을 수 있다.
(python3 -c "import sys; sys.stdout.buffer.write(b'a'*52 + b'\xbe\xba\xfe\xca')"; cat) | nc 0 9000
0x34는 10진수로 52이다. 52바이트의 더미문자열을 추가하고 그 뒤에 4바이트로 0xcafebabe의 리틀엔디안 바이트 문자열을 추가한다.
python3 -c 는 페이로드를 stdin으로 출력하고 종료하니 cat을 실행해 stdin을 계속 열어둔다.

'Computer Science > Computer Security' 카테고리의 다른 글
| [SSS] Race Condition (0) | 2025.10.20 |
|---|---|
| [SSS] Return Oriented Programming (0) | 2025.10.09 |
| [SSS] Format String Bug (0) | 2025.10.06 |
| [SSS] Control Flow Hijacking - Shellcode (0) | 2025.09.29 |
| [SSS] Set-UID Privileged Programs (0) | 2025.09.13 |
댓글
이 글 공유하기
다른 글
-
[SSS] Return Oriented Programming
[SSS] Return Oriented Programming
2025.10.09 -
[SSS] Format String Bug
[SSS] Format String Bug
2025.10.06 -
[SSS] Control Flow Hijacking - Shellcode
[SSS] Control Flow Hijacking - Shellcode
2025.09.29 -
[SSS] Set-UID Privileged Programs
[SSS] Set-UID Privileged Programs
2025.09.13