我有一个使用缓冲区溢出来到达另一个函数的作业:
int func1() {
printf("1");
return;
}
int func2() {
char buf[10];
scanf("%s",buf);
return;
}
int main() {
func2();
return 0;
}
我得到
buf
从地址0x7fffffffe210开始,函数func1
地址是0x5555555551b1,但我不知道$rip在哪里,所以我不知道需要多少填充。
我还尝试在 Mac 上使用 lldb,问题是相同的。我知道函数地址,但不知道电脑地址。
func1
地址是0x5555555551b1func2
地址是0x5555555551c3buf
地址是0x7fffffffe210为此,您需要在 func2 中调用 func1,但您需要检查堆栈的增长方式。地址是否变小或变大。如果它们变小,那么你很幸运。如果它们变得更大,你必须尝试 -ve 索引。所以
void func1()
{
char small[1];
/* try accessing small[2] or higher - see whether you can get to func2 variables*/
}
void func2()
{
char reachable[] = "Success";
func1();
}
int main()
{
char reachable[] = "woo hoo";
func2();
}