ghkdtlwns987

_IO_FILE_vtable 2 본문

시스템

_IO_FILE_vtable 2

2020/03/31 2020. 10. 10. 14:48

저번에 _IO_FILE_vtable 에 대해 알아보았다. 

이번엔 이를 가지고 어떻게 Exploit 을 하는지, 나아가 _IO_list_all 에 대해 공부해보도록 하겠다. 

너무 길어진다면 끊겠지만, 내용이 적으면 _IO_FINISH 함수와 _IO_overflow 함수로 Exploit 하는 방법에 대해 다루도록 하겠다. 

 

1. 먼저 _IO_FILE_vtable을 덮어 Exploit 하는 방법에 대해 다루도록 하겠다. 

다음은 드림핵에 있는 코드를 가져와 보겠다. 

// gcc -o fp_vtable fp_vtable.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
char name[256] = "\0";
FILE *fp = NULL;
void getshell() {
        system("/bin/sh");
}       
int main()
{
        int bytes;
        char random[4];
        fp = fopen("/dev/urandom", "r");
        printf("Name: ");
        fflush(stdout);
        gets(name);
        
        fread(random, 1, 4, fp);
        
        printf("random: %s", random);
        return 0;
}

다음의 코드는 name 전역변수에 값을 gets() 함수로 입력을 받는 코드이다. 

이는 _IO_FILE_ 구조체를 자신이 원하는대로 덮을 수 있다. 

드림핵에서는 _IO_FILE_vtable 구조체에서 0xd8 만큼 떨어져 있는 vtable 을 덮어준다. 

(내가 직접 하는것을 보여주려고 했지만, 노트북에 설치되어 있는 Ubuntu 버젼이 16.04부터 있어서 따로 보여줄 수가 없다...) 참고로 _IO_FILE_vtable을 덮는 것은 Ubuntu 16.04 에 들어오면서 _IO_FILE_vtable_check 루틴이 생기면서 지금과 같은 방법으로 Exploit 하는 것은 불가능하다. 이는 나중에 다루겠다. 

 

만약 다음과 같이 vtable 값만 덮어쓰게 된다면 OS는 vtable 값을 참조할 때, 0x41414141을 가리킬 것이다. 

그렇다면 이를 이용해 Exploit 할 수 있다. 

다음과 같이 vtable 값을 0x6011b0 값으로 넣어놓고, 

0x6011b0 + 0x40 만큼 떨어진 거리에 get_shell() 함수를 넣어주게 되면 vtable 값을 참조할 떄

get_shell() 함수가 실행될 것이다. 0x40 만큼 떨어진 거리로 주는 이유가 뭐냐면 fread() 함수가 호출이 되면 

 JUMP_INIT (xsgetn, method_xsgetn)  

위의 함수가 호출이 되는데, 이는 vtable + 0x40 만큼 떨어져 있기 때문이다. 

하지만 이 방법은 Ubuntu 16.04 버젼 이후 부터는 다음과 같은 방법이 불가능하다. 

 

 

2. _IO_list_all 

다음은 _IO_list_all 에 대해 알아보겠다. 

_IO_list_all 은 FILE 구조체를 가리킨다. 

House Of Orange 를 공부하거나, FSOB 를 공부할 때, 개인적으로 중요하다고 생각하는

구조체이니 꼭 알아두었으면 한다.

우선 간단히 말해서 _IO_list_all 구조체는 _IO_FILE_plus 구조체를 가리키는 포인터이다. 

그림으로 정리하자면 다음과 같다. 

그림을 봤으니 실제로 어떤지 확인해보도록 하자. 

다음을 보면 _IO_list_all 을 출력했는데, flag 값 등... 마지막엔 _IO_file_jumps 구조체가 들어있다.

그렇다면, _IO_list_all 을 이용하는 Exploit 도 할 수 있을 것이다. 

맨 처음 vtable 을 가지고 Exploit 했었다면, _IO_list_all 구조체를 가지고도 Exploit 할 수 있을 것이다. 

(libc_base 가 주어지기만 한다면) 과정은 생략하도록 하겠다. 

 

(정리) _IO_file_vtable 을 덮는 방법은 Ubuntu16.04 에서 막혔다. 이를 bypass 해야한다. 

_IO_list_all 구조체는 _IO_FILE_plus 를 가리킨다.

 

'시스템' 카테고리의 다른 글

FSOB(_IO_flush_all_lockp )  (0) 2020.10.10
flose() 분석  (0) 2020.10.10
FSOB(File Stream Oriented Programming) 1  (0) 2020.10.10
_IO_FILE_vtable_check  (0) 2020.10.10
_IO_FILE_vtable 1  (0) 2020.10.10
Comments