버퍼 오버플로우 공격 (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개 입력해서 발생하는 기본적인 버퍼 오버플로우 예시이다.
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까지 메모리 주소가 입력값으로 덮어진 것이다.
'리버스 엔지니어링 (Reversing) > Archive' 카테고리의 다른 글
어셈블리어 명령어 (assembler language) (0) | 2021.08.22 |
---|---|
버퍼 오버플로우 공격 (Buffer overflow attack) - 2 (0) | 2021.08.20 |