Stack Buffer Overflow...

Fransis__·2023년 5월 11일
0

pwn

목록 보기
4/5

BackGround : Calling Convention

  1. 학습 목표
    • cdecl, SYSV 호출 규약이 무엇인지, 그리고 다음 코스에서 배우는 스택 버퍼 오버플로우가 왜 위험한지 이해할 수 있다.
  2. 서론 : 함수 호출 규약
    • 함수의 호출 및 반환에 대한 약속
      • 함수를 호출할 때는 반환된 이후를 위해 호출자(Caller)의 상태(Stack frame) 및 반환 주소(Return Address)를 저장
      • 호출자는 피호출자(Callee)가 요구하는 인자를 전달
      • 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 함
    • 종류
      • x86
        • cdecl
        • stdcall
        • fastcall
        • thiscall
      • x86-64
        • System V AMD64 ABI - Calling Convention
        • MS ABI - Calling Convention
  3. x86 호출 규약 - cdecl
    • 특징
      • 스택을 통해 인자를 전달
        • 마지막 인자부터 첫 번째 인자까지 거꾸로 스택에 push
      • 인자를 전달하기 위해 사용한 스택을 호출자가 정리
  4. SYSV - 리눅스는 SYSV ABI 기반
    • SYStem V (SYSV) Application Binary Interface (ABI)
      • ELF format
      • Linking method
      • calling convention, etc...
    • Features of Calling Convention in SYSV
      • 6개 인자 - RDI, RSI, RDX, RCX, R8, R9에 순서대로 전달
      • Caller에서 인자 전달에 사용된 스택 정리
      • 함수 반환 값은 RAX로 전달

Background - main함수의 매개변수 2개

// argc.c  / gcc -o argc argc.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    printf("argc : %d\n",argc);
   	for(int i=0;i<argc;i++)
    {
        printf("argv[%d] : %s\n",i,argv[i]);
    }
    exit(0);
}
  • int argc : 메인함수에 전달되는 정보의 갯수
  • char* argv[ ] : 메인함수에 전달되는 실질적 정보
    • argv[0] = "C:\dir" 또는 "/dir" (실행경로)
    • argv[1], .... : 문자열 단위 데이터 (공백기준)
    • 숫자도 문자열형태로 들어와서 변환 필요

Main : Stack Buffer Overflow

  1. 스택 버퍼 오버플로우를 이해하고, 이로 인해 발생할 수 있는 보안상의 위협을 안다.

  2. 서론

    • Stack Overflow vs Stack Buffer Overflow...?
      • 전자는 스택영역이 너무 많이 확장되어 발생한 버그
      • 후자는 스택의 버퍼에 지정 크기보다 많은 데이터가 입력되어 발생하는 버그
  3. 버퍼 오버플로우

    • 스택버퍼에서 발생하는 오버플로우

      • 버퍼 : 데이터 임시 저장소 - 유실 방지, 간접적 data 전달
        • 송신 - 버퍼로 전송, 수신 - 버퍼에서 꺼냄 (완충작용)
        • 스택의 지역변수 - 스택 버퍼, 힙 할당 메모리 - 힙 버퍼
        • 메모리 상에 연속적으로 할당됨 - 오버플로우 발생 시 뒤 버퍼 값 조작될 위험 존재 - 보안 위협
      • ex : 10B 버퍼에 20B 크기 데이터가 들어가려 하면 발생

  1. 데이터 변조 : 입력을 제한하지 않으면 해당 버퍼 뒤의 다른 버퍼의 값까지 바꿀 수 있음

  2. 데이터 유출 : char temp[16]을 선언하고 버퍼에 오버플로우를 발생시켜 다른 버퍼 사이 null바이트를 모두 제거하면 그 다른 버퍼까지 출력시켜서 그 버퍼의 데이터까지도 뽑아낼 수 있음

  3. 실행 흐름 조작 : sbof로 함수의 반환 주소를 조작하면 프로세스의 실행 흐름을 바꿀 수 있음

profile
_DM_S_1W_ | KH2P

0개의 댓글