버퍼 오버플로우 공격 (Buffer overflow attack) - 1

oolongeya

·

2021. 8. 20. 16:16

리눅스 디버거를 사용하며 버퍼 오버플로우 공격에 대한 내용을 학습한다.

Buffer overflow example code 1 : bof1.c (32bit)

 

1
2
3
4
5
6
7
8
9
#include <string.h>
 
int main()
{
    char buf[10];
    strcpy(buf, "aaaabbbbccccdddd");
    return 0;
    
}
cs

 

buf의 크기는 10인데, 입력 값을 16개 입력해서 발생하는 기본적인 버퍼 오버플로우 예시이다.

컴파일 시 버퍼오버플로우 경고를 표시해준다
실행 시 Segmentation fault 오류 발생

 

gdb -q bof1 

= -q 옵션은 quit 옵션으로 gdb에 대한 상세 설명을 생략한다

 

알아두면 좋은 옵션들은

 

set disassembly-flavor intel : intel 문법으로 보기

layout asm -> 어셈블리 창 보기

layout regs -> 레지스터리 창 보기

disas main -> main 함수 디스어셈블

b *main -> main 함수 시작부분에 브레이크 포인트

run, r -> 프로그램 실행

nexti, ni -> 한 줄 실행

next, n -> 프로그램 이어서 실행

 

또한 메모리의 내용을 확인할 수 있는 명령어도 존재한다

 

x/16x $esp

 

x : 메모리 조사

16 : 보여지는 개수

x : 16진법 형태로 (b : 1byte, h : 2byte, w: 4byte, g: 8byte)

$esp : esp 주소를

 

 

eax 시작부터 문자들이 들어간 것을 확인할 수 있다.

 

ebp 레지스터를 확인해보자 0x64646363인데

 

ebp+4 주소에 해당하는 메모리 값은 0xb7df6464 이다

이게 무슨 말이냐면 ebp 주소 위 ret 주소값이 오염된 것이다. 

 

따라서 main 함수 종료 후 변조된 ret 주소로 복귀하면서 메모리 접근 오류가 발생하는 것이다.

 

이와 같이 메모리가 구성된다. eax-10 부터 6161626263636464 값들이 입력되면서 ebp를 넘어 ret까지 메모리 주소가 입력값으로 덮어진 것이다.

 

반응형