我试图溢出 64 字节的缓冲区。
通过调用 gets
我的理解是总共需要写入65个字节来填充缓冲区,然后再写入另外4个字节来填充栈帧指针。
接下来的 4 个字节应该覆盖返回地址。
然而,我希望写入的地址是804846A
。
- 这与
0x0804846A
相同吗?如果是这样,我发现很难输入 04 (^D) - 是否应该以相反的顺序输入? (6A 84 04 08)?
- 我运行的一些初始实验的输入是 ZZZZZ..(64 次)..AAAABBBB
最终使
ebp
寄存器成为0x42414141
- 我运行的一些初始实验的输入是 ZZZZZ..(64 次)..AAAABBBB
最终使
有问题的架构是 x86。
更新:我设法使 ASCII 代码 0x04
和 0x08
正常工作。问题似乎出在 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/