Я пытаюсь узнать переполнения буфера из книги «Искусство эксплуатации - Джон Эриксон».Я приложил код, который был дан.
Следующим шагом после компиляции кода была отладка его с помощью gdb.Точка останова была установлена непосредственно перед строкой
if(check_authentication(argv[1]))
, и я запустил код с аргументом командной строки
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Когда была достигнута точка останова, я запустил следующее в gdb и получилсоответствующий вывод:
(gdb) i r rsp
rsp 0x7fffffffdcc0 0x7fffffffdcc0
(gdb) x/32xw $rsp
0x7fffffffdcc0: 0x00000000 0x000000ff 0xffffe1e0 0x00007fff
0x7fffffffdcd0: 0x00000000 0x00000000 0x00000000 0x00000000
0x7fffffffdce0: 0x00000001 0x00000000 0x0040083d 0x00000000
0x7fffffffdcf0: 0x00000000 0x00000000 0x0e56b100 0x0d94ed6d
0x7fffffffdd00: 0xffffdd20 0x00007fff 0x004007b3 0x00000000
0x7fffffffdd10: 0xffffde08 0x00007fff 0x00000000 0x00000002
0x7fffffffdd20: 0x004007f0 0x00000000 0xf7a2d830 0x00007fff
0x7fffffffdd30: 0x00000000 0x00000000 0xffffde08 0x00007fff
Теперь я знаю, что следующее состоит из значений из стекового фрейма main, и я выяснил, что 0x4007b3 - это возвращаемое значение после просмотра дампа основного кода.Я хочу знать, какое значение из приведенных выше точек указывает на мой ввод в командной строке.
Я работаю в Ubuntu Linux.Я попытался использовать x / 32b на всех значениях, но не могу найти 30 A, которые я дал на входе.
Код ниже:
int check_authentication(char *password){
char password_buffer[16];
int auth_flag = 0;
printf("auth_flag: %p\n", &auth_flag);
printf("password_buffer: %p\n", password_buffer);
strcpy(password_buffer,password);
if(strcmp(password_buffer, "brillig") == 0) auth_flag = 1;
if(strcmp(password_buffer, "outgrabe") == 0) auth_flag = 1;
return auth_flag;
}
int main(int argc, char *argv[]){
if(argc < 2){
printf("Usage: %s <password>\n", argv[0]);
exit(0);
}
if(check_authentication(argv[1])){
printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
printf(" Access Granted.\n");
printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
}
else{
printf("\nAccess Denied.\n");
}
}