【问题标题】:Using Jumps directly in RET register直接在 RET 寄存器中使用跳转
【发布时间】:2011-11-14 15:51:55
【问题描述】:

我正在处理缓冲区溢出问题,其中输入字符串必须(显然)用我的输入字符串中的 shellcode 的地址覆盖 RET。

我研究过,发现像这样在运行时确定缓冲区的内存地址并不容易。

我还了解了相对跳跃。是否可以通过相对跳转到 shellcode 开始的堆栈(和我的字符串)的较早部分来覆盖 RET?不知道行不行。

基本上它看起来像这样: ./program 90909090909090/bin/sh/00RELATIVE_JUMP_HERE

显然所有这些都是机器代码,这只是为了说明我要完成的工作。

谢谢

【问题讨论】:

  • 对您正在尝试的内容进行更详细描述的代码示例会有所帮助。
  • Win32 中的一种常用技术(二进制文件已经编译并且不会更改)是使返回地址指向“JMP ESP”指令,该指令会跳转到 shellcode。
  • 没有太多代码可以展示。 ./program 所做的只是创建一个 33 字节的缓冲区,然后将 ARG[1] 读入其中。就是这样……

标签: assembly buffer stack-overflow shellcode


【解决方案1】:

在堆栈溢出中覆盖的不是 RET 指令,而是返回地址。所以你不会覆盖机器代码,而是一个指向机器代码的指针。确实有一些技术可以不断跳转到有趣的代码片段,谷歌搜索 ret-into-libc 和面向返回的编程。

类似地,一种著名的技术是“trampoline”技术,您可以让返回地址指向一个“JMP ESP”指令,该指令会跳回溢出的缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多