我正在尝试从“开发的艺术-乔恩·埃里克森”一书中学习缓冲区溢出。我已经附上了给出的代码。
编译代码后的下一步是使用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");
}
}