hOwDayS 선린 10720

pwnable uaf 본문

공부/pwnable.kr

pwnable uaf

hOwDayS 2018. 1. 11. 16:48

uaf(user after free) 문제이다


 A의 동적할당을 해제하고 다시 A를 다시 사용하였을때 똑같은 공간에 할당된다는 취약점을 이용한다.


uaf.cpp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#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;    
}
 
cs


처음 실행할때 m , w을 동적할당한다.



기존에 /tmp/qwe/AAAA 파일에 AAAA를 썼다.


CASE 1 : m , w introduce

CASE 2: argv[1] (Size) argv[2] (파일 내용) 을 읽는다.

CASE 3:   m, w 동적할당 해제


CASE1 내용이다 


내용 같은경우 (man)


rax 에 rbp - 0x38 을 넣고


rax 에다가 8을 더한다음


rdx 에 rax 를 넣고 실행 시킨다.




브레이크포인트를 걸고 실행시킨다.


rbp - 0x38에서 쭉 들어가다 보면 


0x0040117a 가 give_shell 이라는 것을 알 수 있다

Man 을 넘긴 introduce 가 0x004012d2 라는 것을 알 수있다


아쉽지만 좀 더 실행시키면 rax 에 8를 더하므로 결과적으로 실행시키는 것은 0x004012d2 이다 


하지만 우리는 여기서 예상 공격 루트를 생각할 수 있다.


1. 0x401570 - 0x8 이 있는 파일을 보낸다

2. 차례대로 free - > after - > use실행

그러면 Man은 rax 값을 참조하게 되며 그 값은 give_shell이 되므로 최종적으로 셸을 딸 수 있게 된다.



main + 265 에 브레이크를 걸고 하나씩 rax값을 보기로 했다.


3 - 2 -1 로 실행시킨다

조금 더 내려가서 rax값을 확인해보았다.

rax값을 보면 밑에 AAAA값을 있다는 것이 보인다


실행 루트를


3 - 2 - 2 -1 로 해보겠다


똑같이 내려서 rax값을  한줄 씩 살펴보면 AAAA값이 위에 채워진것을 볼 수 있다.


공격루트가 확실하게 나왔다



1. 0x401570 -  0x8 이 있는 파일 보낸다

2. 차례대로 free - > after - > after - use 실행




다른 글을 참조 해버렷다

'공부 > pwnable.kr' 카테고리의 다른 글

pwnable.kr simplelogin  (0) 2018.01.20
pwnable.kr brainfuck  (2) 2018.01.20
pwnable asm  (0) 2018.01.12
pwnable.kr lotto  (0) 2018.01.11
pwnable.kr coin1  (0) 2018.01.10
Comments