bof) 스텍 기반의 버퍼오버 플로우 -default
버퍼오버 플로우에는 크개 두가지가 있습니다.
스텍 기반의 오버플로우 힙 기반의 오버플로우가 있습니다.
이중에서 스텍기반의 오버플로우를 해보겟습니다.
스텍 구조는 다음과 같습니다.
버퍼오버플로우의 최종 목표는 ret 즉 리턴주소를 변경하는 것입니다.
32비트 에서는 스택주소의 크기가 4바이트 이고 64비트에서는 8바이트 입니다.
자신의 컴퓨터의 비트에따라 스택 주소의 크기가 달라지니 주의
오버플로우 기술은 매우 오래되었지만 현재까지 쓰이고 있는 기술이며 근본적으로는 막을수가 없습니다.
(컴퓨터 os 구조상 불가능하져)
버퍼오버플로우를 어렵게 하는 기술이 있습니다.
윈도우에는 ssecurity cookie나 리눅스에는 alsr이라든지 여러가지 방어 기술이 있습니다.
저는 이방어기술을 스킵하기위해 최적화 옵션을 제거하고 해보도록 하겟습니다.
저는 버퍼오버플로우 취약점이 있는 간단한 프로그램을 만들었습니다.
쉘에서 입력받는 문자열을 그대로 출력하는 프로그램입니다.
이프로그램이 취약점이 있는 이유는 간단합니다. b라는 포인터의 데이터를 100개의 방밖에 없는 buffer에 집어넣기때문에 전부다 집어넣지 못하기 떄문에 일어 남니다.
컴파일을 하고 쉘을 통해 입력을 하면 위 사진과 같이 뜸니다.
-static 옵션은 최적화 옵션을 해제하는 옵션입니다.
lea 오퍼랜드 함수는 주소를 나타내는 함수입니다.
rax에 rbp에서 0x70만큼떨어저있는 b포인터함수의 주소를 넣어서 rax에 입력한값을 넣는것이져
0x70은 10진수로 표현하면 112입니다.
컴퓨터에서 버퍼오버플로우를 방지하기위해 빈공간이 조금 있습니다.
info func 명령어는 gdb에서 프로그램에서 사용된 함수를 나타내주는 명령어 입니다.
해더파일에는 많은 함수가 내장되어있으므로 많은 함수가 보임니다.
우리가 만든 hack 함수가 바로 보이네요
주소는 0x0000000000400e30 입니다.
컴퓨터에서는 리틀에디안 방식을 사용합니다.
따라서 주소를 반대로 압력해주셔야 합니다.
위에서 버퍼의크기는 112라고 했습니다. 그런데 sfp가 있으므로 8바이트를 더 추가해 주셔야합니다.
총 120 바이트 입니다.
이제 버퍼오버플로우 공격을 해보면
짜짠하고 성공합니다.
'System > Buffer Over Flow' 카테고리의 다른 글
buffer over flow 이론 (0) | 2015.01.06 |
---|---|
간단한 hello_world 쉘 코드 만들기 shell code (0) | 2014.09.03 |