C 缓冲区溢出 - 返回地址不能用 ASCII 表示

标签 c stack-overflow exploit stack-smash

我试图溢出 64 字节的缓冲区。
通过调用 gets

填充缓冲区

我的理解是总共需要写入65个字节来填充缓冲区,然后再写入另外4个字节来填充栈帧指针。
接下来的 4 个字节应该覆盖返回地址。

然而,我希望写入的地址是804846A

  • 这与 0x0804846A 相同吗?如果是这样,我发现很难输入 04 (^D)
  • 是否应该以相反的顺序输入? (6A 84 04 08)?
    • 我运行的一些初始实验的输入是 ZZZZZ..(64 次)..AAAABBBB 最终使 ebp 寄存器成为 0x42414141

有问题的架构是 x86。

更新:我设法使 ASCII 代码 0x040x08 正常工作。问题似乎出在 0x84 上。我尝试从 http://www.ascii-code.com 复制对应于 0x84 的符号这显然是 。然而,C 似乎将此符号解析为大于 1 字节的表示。

我还尝试使用 ä,如 http://www.theasciicode.com.ar 中所述
这也导致表示大于 1 个字节。

最佳答案

您似乎依赖于特定编译器和 CPU 架构的实现细节。例如:

  • 并非所有 CPU 架构都使用帧指针。
  • 不同 CPU 的字节顺序不同,这会影响您是否需要“反转”字节。
  • 堆栈元信息(帧指针等)相对于给定局部变量的位置在编译器之间会有所不同,甚至在使用不同优化选项的同一编译器之间也会有所不同。

关于C 缓冲区溢出 - 返回地址不能用 ASCII 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19528543/

相关文章:

c - Printf 打印的字符比我的字符串中包含的字符多

c - 为什么余数不适用于 Float 值?

c - 分析字符串中字符的频率

java - 归并排序实现给出了 StackOverflow

c - 如何测试 C 中的输入字符串是否为正确的 'format' ?

c# - for 循环如何与堆栈溢出相关?

c - 为什么我分配一个11MB的char数组,而栈上限是10MB,我的程序却不会溢出栈?

shell - 使用 `eval` 用文件中的文本定义函数是邪恶的吗?

c++ - 成功打印超出范围的字符串索引