"); } 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할 부분들은 릭하면 될 거 같다.