버퍼오버플로우 문제이다.
// gcc -o baby-bof baby-bof.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
void proc_init ()
{
setvbuf (stdin, 0, 2, 0); setvbuf (stdout, 0, 2, 0);
setvbuf (stderr, 0, 2, 0);
}
void win ()
{
char flag[100] = {0,};
int fd;
puts ("You mustn't be here! It's a vulnerability!");
fd = open ("./flag", O_RDONLY);
read(fd, flag, 0x60);
puts(flag);
exit(0);
}
long count;
long value;
long idx = 0;
int main ()
{
char name[16];
// don't care this init function
proc_init ();
printf ("the main function doesn't call win function (0x%lx)!\n", win);
printf ("name: ");
scanf ("%15s", name);
printf ("GM GA GE GV %s!!\n: ", name);
printf ("| addr\t\t| value\t\t|\n");
for (idx = 0; idx < 0x10; idx++) {
printf ("| %lx\t| %16lx\t|\n", name + idx *8, *(long*)(name + idx*8));
}
printf ("hex value: ");
scanf ("%lx%c", &value);
printf ("integer count: ");
scanf ("%d%c", &count);
for (idx = 0; idx < count; idx++) {
*(long*)(name+idx*8) = value;
}
printf ("| addr\t\t| value\t\t|\n");
for (idx = 0; idx < 0x10; idx++) {
printf ("| %lx\t| %16lx\t|\n", name + idx *8, *(long*)(name + idx*8));
}
return 0;
}
코드를 실행하면 win함수의 주소를 알려주소(0x40125b)를 알려주고 name을 입력받는다.
코드를 보면 scanf ("%15s", name); 로 입력 받고 있으므로 아래와 같이 15글자를 입력해본다.
스택값을 보면 7ffe4e623b40, 7ffe4e623b48에서
31,32 가 나오는걸 볼수 있는데 이건 숫자 1의 아스키코드 값(0x31),(0x32)이다.
또한 7ffe4e623b88 부분이 main 함수를 실행 시키는 부분인거 같다.
이제 이 부분을 win 함수의 주소값으로 바꿔주는것이 목표이다.
주어진 문제 코드를 보면 main 함수 안에 아래와 같은 코드가 있다.
이 코드는 name배열이 저장된 다음 줄부터 count 줄만큼 value로 수정한다. (스택 한 줄에 8바이트)
즉, count는 2이상으로, value는 0x40125b으로 입력하면 name이 저장되어 있는 곳을 넘어서 다른 값들이 수정되는 BOF가 발생하게 된다.
for (idx = 0; idx < count; idx++) {
*(long*)(name+idx*8) = value;
}
DH{62228e6f20a8b71372f0eceb51537c7f94b8191651ea0636ed4e48857c5b340c}