我正在阅读shellcoder的手册,我目前在第2章,我有一个简单的程序可以通过溢出预期的输入然后为ret指令发出一个新位置来利用,这样函数return_input可以执行两次!
这是用C
制作的简单程序void return_input (void)
{
char array[30];
gets (array);
printf(“%s\n”, array);
}
main()
{
return_input();
return 0;
}
这是主要功能的反汇编版本,我们可以看到调用函数的跳转地址。
我使用以下命令并输入溢出的字符,后面跟着应该替换ret的内容的地址
但是你可以看到我没有运行两次return_input函数而只是打印出一个问号并说分段失败
答案 0 :(得分:0)
gets
读取终止字节并用NULL字节替换它,因此您所需的ret
被该NULL字节打破。 PIE
标志,因此实际地址可能看起来像0x55555????58a
,这就是为什么gdb不允许您插入断点,因为您可能尝试执行b *0x58a
或其他操作。使用-no-pie
进行编译可以让生活更轻松。