https://mandu-mandu.tistory.com/99
해당 블로그 내용을 참고하였습니다.
UAF User After Free 해당 취약점은 heap 영역에서 발생한다.
UAF는 메모리를 malloc 해주었다가 free 해주고 다시 malloc 한 경우를 말한다.
#include <fcntl.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
using namespace std;
class Human{
private:
virtual void give_shell(){
system("/bin/sh");
}
protected:
int age;
string name;
public:
virtual void introduce(){
cout << "My name is " << name << endl;
cout << "I am " << age << " years old" << endl;
}
};
class Man: public Human{
public:
Man(string name, int age){
this->name = name;
this->age = age;
}
virtual void introduce(){
Human::introduce();
cout << "I am a nice guy!" << endl;
}
};
class Woman: public Human{
public:
Woman(string name, int age){
this->name = name;
this->age = age;
}
virtual void introduce(){
Human::introduce();
cout << "I am a cute girl!" << endl;
}
};
int main(int argc, char* argv[]){
Human* m = new Man("Jack", 25);
Human* w = new Woman("Jill", 21);
size_t len;
char* data;
unsigned int op;
while(1){
cout << "1. use\n2. after\n3. free\n";
cin >> op;
switch(op){
case 1:
m->introduce();
w->introduce();
break;
case 2:
len = atoi(argv[1]);
data = new char[len];
read(open(argv[2], O_RDONLY), data, len);
cout << "your data is allocated" << endl;
break;
case 3:
delete m;
delete w;
break;
default:
break;
}
}
return 0;
}
case 1
1 입력 시 각 객체의 introduce() 함수가 호출
2 입력 시 char 객체를 생성
3 입력 시 m, w 객체가 free 가 된다.
초기화된 m, w 객체를 입력하여 free 해주고 다시 2를 입력하여 같은 크기로 새로운 객체를 생성해주면 free된 m, w 자리에 초기화 되면서 취약점이 발생한다. m, w객체의 introduce() 함수 주소가 담긴 주소를 알아내어 쉘을 획득하는
give_shell() 함수 주소로 덮어 씌워주면 쉘을 획득할 수 있다...
free -> after -> after > use를 하고 ni 명령어로 차례대로 내려가면 give_shell 실행이 된다.
https://koyo.kr/post/pwnable-kr-uaf/
'시스템' 카테고리의 다른 글
AFL Fuzzer (0) | 2022.10.22 |
---|---|
퍼징으로 1-day 취약점 분석하기(GIMP) (0) | 2022.10.22 |
Exploiting Null Byte Buffer Overflow for a $40,000 Bounty (0) | 2019.12.26 |
Pwning VMWare, Part 1: RWCTF 2018 Station-Escape (0) | 2019.12.24 |
x64 Stack 개요 (0) | 2019.12.11 |