BOF κ΄λ ¨ λ¬Έμ μ΄λ€.
// 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); //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κΈμλ₯Ό μ
λ ₯ν΄λ³Έλ€.
μ
λ ₯ ν μΆλ ₯λ μ€ν κ°λ€μ 보면 첫 μ€(7ffd4bd3c170
)κ³Ό λλ²μ§Έ μ€(7ffd4bd3c178
)μ μ¬λ¬ κ°μ 0x31κ³Ό ν κ°μ 0x32κ° μλ€.
μ΄λ κ°κ° 1κ³Ό 2μ μμ€ν€μ½λμ 16μ§μκ°μ΄λ―λ‘ μ΄ λ μ€μ name λ°°μ΄μ΄ μ μ₯λμ΄ μμμ μ μ μλ€.
λν 4λ²μ§Έ μ€(7ffd4bd3c188
)μ 7fb8fc2dcd90
λ main
ν¨μ μ€ν νμ μ΄λν κ³³, μ¦ main ν¨μλ₯Ό μ€νμν¨ κ³³μΈ κ² κ°λ€.
μ΄μ μ΄ λΆλΆμ win
ν¨μμ μ£Όμλ‘ λ°κΎΈλ κ²μ΄ λͺ©νμ΄λ€.
μ£Όμ΄μ§ λ¬Έμ μ½λλ₯Ό 보면 main
ν¨μ μμ μλμ κ°μ μ½λκ° μλ€.
μ΄ μ½λλ name
λ°°μ΄μ΄ μ μ₯λ λ€μ μ€λΆν° count
μ€λ§νΌ value
λ‘ μμ νλ€. (μ€ν ν μ€μ 8λ°μ΄νΈ)
μ¦, count
λ 2μ΄μμΌλ‘, value
λ 0x40125b
μΌλ‘ μ
λ ₯νλ©΄ nameμ΄ μ μ₯λμ΄ μλ κ³³μ λμ΄μ λ€λ₯Έ κ°λ€μ΄ μμ λλ BOFκ° λ°μνκ² λλ€.
for (idx = 0; idx < count; idx++) {
*(long*)(name+idx*8) = value;
}
λ§μ½ main
ν¨μμ λ¦¬ν΄ μ£Όμ μμΉλ₯Ό λͺ¨λ₯΄λλΌλ λ€μκ³Ό κ°μ΄ μΆλ ₯λ μ€νμ λͺ¨λ κ°μ 0x40125b
μΌλ‘ λ°κΏλ²λ¦¬λ©΄ main
ν¨μ μ€ν ν win
ν¨μκ° μ€νλμ΄ flag κ°μ΄ μΆλ ₯λλ€.
π DH{62228e6f20a8b71372f0eceb51537c7f94b8191651ea0636ed4e48857c5b340c}