"); } int main(int argc, char *argv[]) { unsigned char box[0x40] = {}; char name[0x40] = {}; char select[2] = {}; int idx = 0, name_len = 0; initialize(); while(1) { menu(); read(0, select, 2); switch( select[0] ) { case 'F': printf("box input : "); read(0, box, sizeof(box)); break; case 'P': printf("Element index :"> "); } int main(int argc, char *argv[]) { unsigned char box[0x40] = {}; char name[0x40] = {}; char select[2] = {}; int idx = 0, name_len = 0; initialize(); while(1) { menu(); read(0, select, 2); switch( select[0] ) { case 'F': printf("box input : "); read(0, box, sizeof(box)); break; case 'P': printf("Element index :"> "); } int main(int argc, char *argv[]) { unsigned char box[0x40] = {}; char name[0x40] = {}; char select[2] = {}; int idx = 0, name_len = 0; initialize(); while(1) { menu(); read(0, select, 2); switch( select[0] ) { case 'F': printf("box input : "); read(0, box, sizeof(box)); break; case 'P': printf("Element index :">
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}
void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(30);
}
void get_shell() {
    system("/bin/sh");
}
void print_box(unsigned char *box, int idx) {
    printf("Element of index %d is : %02x\\n", idx, box[idx]);
}
void menu() {
    puts("[F]ill the box");
    puts("[P]rint the box");
    puts("[E]xit");
    printf("> ");
}
int main(int argc, char *argv[]) {
    unsigned char box[0x40] = {};
    char name[0x40] = {};
    char select[2] = {};
    int idx = 0, name_len = 0;
    initialize();
    while(1) {
        menu();
        read(0, select, 2);
        switch( select[0] ) {
            case 'F':
                printf("box input : ");
                read(0, box, sizeof(box));
                break;
            case 'P':
                printf("Element index : ");
                scanf("%d", &idx);
                print_box(box, idx);
                break;
            case 'E':
                printf("Name Size : ");
                scanf("%d", &name_len);
                printf("Name : ");
                read(0, name, name_len);
                return 0;
            default:
                break;
        }
    }
}

문제의 소스코드는 위와 같다.

취약점 분석

while(1) {
        menu();
        read(0, select, 2);
        switch( select[0] ) {
            case 'F':
                printf("box input : ");
                read(0, box, sizeof(box));
                break;
            case 'P':
                printf("Element index : ");
                scanf("%d", &idx);
                print_box(box, idx);
                break;
            case 'E':
                printf("Name Size : ");
                scanf("%d", &name_len);
                printf("Name : ");
                read(0, name, name_len);
                return 0;
            default:
                break;
        }

위에 부분해서 하나의 취약점을 발견할 수 있다.

case 'P':
                printf("Element index : ");
                scanf("%d", &idx);
                print_box(box, idx);
                break;

입력을 받고 해당 입력에 맞는 위치에 값을 출력시킨다.

int main(int argc, char *argv[]) {
    unsigned char box[0x40] = {};
    char name[0x40] = {};
    char select[2] = {};
    int idx = 0, name_len = 0;
    initialize();
.
.
.
.
}

box[0x40]과 name [0x40]

선언된 변수와 배열에 따라 스택 구조를 그리고 이후 보호기법에 따라 Leak할 부분들은 릭하면 될 거 같다.