scanf("%s", str);
RBP = 0x7fffffffffff1000
e RSP = 0x7fffffffffff0ff0
, se antes da função retornar, fosse lido um valor para a string, a stack estaria assim:scanf("%s", var2);
0x00474645
, o que talvez possa causar problemas na execução do programa.0x00515049
? Exatamente. Mas e se essa região não for uma região com permissões para execução? Nesse caso, teremos um segmentation fault
.echo
para escrever esses bytes.echo
e as representações dos três caracteres em hexadecimais.0x41
, 'B' é o 0x42
e 'C' é o 0x43
. O comando echo
no Terminal para imprimir esses três caracteres seria o seguinte:echo -ne '\x41\x42\x43'
echo
imprime a mensagem passada como argumento-e
permite o uso de caracteres de escape com o \
, igual strings em C-n
faz com que ele não termine com um \n
-e
e -n
forma o -ne
. Assim como em C, para representarmos um caractere de escape dado em hexadecimal, usamos \x
seguido do número hexadecimal dele.1
na memória seria 0x00000001
. Porém, o processador leria e escreveria os bytes na seguinte ordem:0x01
0x00
0x00
0x00
0x01234567
, teríamos que escrever os bytes na seguinte ordem:0x67
0x45
0x23
0x01
echo
, fariamos assim:echo -ne '\x67\x45\x23\x01'
0x01234567
, teríamos que escrever qualquer coisa nos 4 bytes do buffer e nos 4 bytes do RBP anterior e por fim escrever o endereço em si. O comando seria:echo -ne 'AAAAAAAA\x67\x45\x23\x01'
|
. Assim:echo -ne 'AAAAAAAA\x67\x45\x23\x01' | ./meuprograma
echo -ne 'AAAAAAAA\x67\x45\x23\x01' > payload.txt
./meuprograma < payload.txt
payload.txt
seria:run < payload.txt