无法在简单程序中利用溢出(第 2 章 shellcoder 手册)
Cant exploit overflow in simple program (chapter2 shellcoder's handbook)
我正在阅读 The Shellcoder's Handbook,我目前正在阅读第 2 章,其中我有一个简单的程序可以通过溢出预期输入然后为 ret 指令发出一个新位置以便函数 return_input 可以利用被执行两次!
这是用C语言编写的简单程序
void return_input (void)
{
char array[30];
gets (array);
printf(“%s\n”, array);
}
main()
{
return_input();
return 0;
}
这是main函数的反汇编版本,可以看到调用函数的跳转地址
我使用以下命令并输入溢出的字符以及后面应该替换 ret 内容的地址
但如您所见,我没有 运行 return_input 函数两次,而是它只是打印出一个问号并表示分割失败
gets
读取终止字节并将其替换为 NULL 字节,因此您想要的 ret
被该 NULL 字节破坏了。
- 您在反汇编代码中看到的偏移量 不是 真实地址,您编译程序时设置了
PIE
标志,因此真实地址可能看起来像 0x55555????58a
,这就是 gdb 不允许您插入断点的原因,因为您可能会尝试执行 b *0x58a
或其他操作。用 -no-pie
编译会让生活更轻松。
我正在阅读 The Shellcoder's Handbook,我目前正在阅读第 2 章,其中我有一个简单的程序可以通过溢出预期输入然后为 ret 指令发出一个新位置以便函数 return_input 可以利用被执行两次!
这是用C语言编写的简单程序
void return_input (void)
{
char array[30];
gets (array);
printf(“%s\n”, array);
}
main()
{
return_input();
return 0;
}
这是main函数的反汇编版本,可以看到调用函数的跳转地址
我使用以下命令并输入溢出的字符以及后面应该替换 ret 内容的地址
但如您所见,我没有 运行 return_input 函数两次,而是它只是打印出一个问号并表示分割失败
gets
读取终止字节并将其替换为 NULL 字节,因此您想要的ret
被该 NULL 字节破坏了。- 您在反汇编代码中看到的偏移量 不是 真实地址,您编译程序时设置了
PIE
标志,因此真实地址可能看起来像0x55555????58a
,这就是 gdb 不允许您插入断点的原因,因为您可能会尝试执行b *0x58a
或其他操作。用-no-pie
编译会让生活更轻松。