如何在c

时间:2019-03-24 20:04:55

标签: c assembly x86-64 att

我正在尝试从“开发的艺术-乔恩·埃里克森”一书中学习缓冲区溢出。我已经附上了给出的代码。

编译代码后的下一步是使用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");
        }
    }

0 个答案:

没有答案