이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[SSS] Control Flow Hijacking - Buffer Overflow

  • 2025.09.21 15:24
  • Computer Science/Computer Security
반응형

 

 

 

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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [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
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (679)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (10)
    • 💬 기록 (8)
    • 📚 공부 (6)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바