Consider the following program (vul.c
) with buffer overflow vulnerability.
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buf[10];
strcpy(buf, argv[1]);
printf("%s\n", buf);
return 0;
}
Above program compiled using gcc -o vul vul.c
and executed on arch linux - linux 4.4.16-1-lts x86-64
gave following output when executed in terminal with ./vul $(perl -e 'print "A"x100')
command:
AAAAAAAAAAA...A
Segmentation fault (core dumped)
Then checking the program status using echo $?
command gave 139
output.
Following program (exp.c
) (for crashing the above program)
#include <stdlib.h>
int main(void)
{
printf("%d\n", system("./vul $(perl -e 'print \"A\"x100')"));
return 0;
}
compiled using gcc -o exp exp.c
when executed with ./exp
command on same system gave following output:
AAAAAAAAAAAA...A
139
I have two questions:
- Why no error message was generated by 2nd program? and,
- I need to compile the program with
-fstack-protector
flag to enable the*** stack smashing detected ***
error messages inarch linux
but not inUbuntu
. InUbuntu
, it might be that this flag is include by default ingcc
or is there any other reason?
printf
implementation... You do knowsystem
returns anint
with the error code (0 if successful), it doesn't return a string. A simpleif(system(...))
will give you the error. If you want to print it as anice looking message, you can probably usestrerror
. – Myst Aug 17 at 5:45