stack buffer overflow 7

Stack Buffer Overflow(BOF) - stack6 (RTL) 문제 해결

이번 문제는 기존의 쉘 코드 삽입 방식이 차단된 상황에서 Return to Libc(RTL) 기법을 활용해서 쉘을 실행하는 방식으로 해결했다. stack에 쉘코드를 넣고 그 위치로 return을 덮는 방식은 실패하기 때문에 라이브러리 함수인 system()을 이용하여 우회하였다. RTL(Return to Libc) 기법이란? stack 실행이 불가능한 상황에서 공격자가 쉘코드 없이도 시스템 명령을 실행할 수 있는 우회 기법이다. 1. 취약점으로 ret 주소를 덮는다. 2. ret 주소를 system() 함수 주소로 설정한다. 3. 그리고 stack에는 system()에 넘길 인자인 /bin/sh를 넣어준다. 즉, 쉘코드가 차단된 상황에서도 libc 함수와 문자열 리터럴만으로 쉘을 실행할 수 있는 기..

Stack Buffer Overflow(BOF) - stack5 문제 해결

stack5는 스택 버퍼 오버플로우(BOF) 문제로, 사용자가 입력한 값이 gets() 함수로 그대로 복사되면서 스택 영역을 침범할 수 있게 된다. 이를 이용하여서 쉘 코드를 삽입하고 코드의 흐름을 바꿔서 쉘을 획득할 수 있다. 코드 분석int main(int argc, char **argv){ char buffer[64]; gets(buffer);} gets() 함수는 입력 길이에 제한이 없기 때문에 buffer를 초과하여 입력하면 EIP를 덮을 수 있다. EIP를 쉘코드의 주소로 덮으면 임의의 코드를 실행할 수 있게 된다. 익스플로잇1. 오프셋(offset) 계산하기# 가상환경 만들기python3 -m venv ~/myenvsource ~/myenv/bin/activatepip3 ins..

Stack Buffer Overflow(BOF) - stack4 문제 해결

stack4는 gets() 함수로 인해 버퍼 오퍼플로우가 발생하고, 이로 인해 리턴 주소(EIP)를 조작해서 win() 함수를 실행하도록 만드는 문제이다. 코드 분석// 디버깅하면서 EIP 레지스터와 버퍼 오버플로우에 대해서 알아보자.#include // 이미 정의된 함수가 있는 라이브러리를 가져와 사용한다. #include #include #include void win(){ // win 함수 정의 및 선언 printf("code flow successfully changed\n");}int main(int argc, char **argv){ // main 함수 프로그램 실행 시 실행되는 함수 char buffer[64]; // 64 바이트 버퍼 생성 gets(buffer); /..

Stack Buffer Overflow(BOF) - stack3 문제 해결

stack3는 함수 포인터를 덮어서 흐름 제어를 바꾸는 BOF 문제이다. win() 함수를 호출하도록 함수 포인터를 조작해야 한다. 코드 분석// 함수 포인터에 대해서 공부하고 함수 포인터의 값을 덮어씌워 원하는 함수를 호출하도록 해보자.#include // #include는 이미 정의된 함수들이 있는 라이브러리를 가져와 쓴다. #include #include #include void win(){ // win 함수를 정의 printf("code flow successfully changed\n");}int main(int argc, char **argv){ // main 함수는 프로그램을 실행했을 때 실행되는 함수. volatile int (*fp)(); // 함수 포인터. 특정한 함수의..

Stack Buffer Overflow(BOF) - stack2 문제 해결

stack2는 환경 변수에 저장된 문자열을 strcpy()로 복사할 때 발생하는 버퍼 오버플로우를 통해 특정 변수 값을 조작하는 문제이다. 환경 변수와 BOF의 연계를 이해하기에 유용했다. 코드 분석stack2.c// 환경 변수를 이용하여 공격하는 방법을 알아보자// 환경 변수에 대해서 알아보자!!#include //#include 이미 여러 함수들이 정의되어 있는 라이브러리를 가져와 사용#include #include #include int main(int argc, char **argv){ //프로그램을 실행했을 때 실행되는 함수 volatile int modified; // 정수 변수를 선언. 이름은 modified (int는 4바이트를 사용) char buffer[64]; //64 ..

Stack Buffer Overflow(BOF) - stack1 문제 해결

stack1 문제는 인자(argument)를 통해 입력을 받아 버퍼 오버플로우를 발생시키고, 특정 변수의 값을 정확히 특정한 값으로 설정해야 성공하는 구조이다. 이번 실습을 통해 리틀 엔디안 메모리 표현 방식과 strcpy() 함수의 위험성을 함께 공부할 수 있었다. 코드 분석stack1.c#include #include #include #include int main(int argc, char **argv){// 인자 : 띄어쓰기 기준으로 1개, "" 묶어주면 띄어쓰기 있어도 1개 volatile int modified; char buffer[64]; if(argc == 1){ errx(1, "Please specify an argument\n"); } modi..

Stack Buffer Overflow(BOF) - stack0 문제 해결

stack0 문제는 스택 기반 버퍼 오버플로우(Stack Buffer Overflow)의 가장 기초적인 개념을 이해하기 위한 실습이다. 사용자 입력을 제한 없이 받아서 변수 값을 조작하는 구조이다. 코드 분석 stack0.c#include #include #include int main(int argc, char **argv){ volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0){ printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); }} ..