hOwDayS 선린 10720
pwnable uaf 본문
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 |