c - 如何执行放在栈上的机器指令

标签 c assembly buffer buffer-overflow machine-instruction

我在我之前的栈帧中有一个返回值指向我后续栈帧中的一个缓冲区。如何获取缓冲区中的机器指令来执行?

这可能吗?根据我对堆栈的了解,这是荒谬的。因为,当然,栈是一个后进先出的结构。换句话说,一旦 PC 到达返回地址,缓冲区就已经被弹出。

有什么想法吗?

<test>函数(下方)调用 <getbuf>功能(也在下面):

08048c53 <test>:
 8048c53:   55                      push   %ebp
 8048c54:   89 e5                   mov    %esp,%ebp
 8048c56:   83 ec 28                sub    $0x28,%esp
 8048c59:   e8 63 04 00 00          call   80490c1 <uniqueval>
 8048c5e:   89 45 f0                mov    %eax,-0x10(%ebp)
 8048c61:   e8 5f 00 00 00          call   8048cc5 <getbuf>
 8048c66:   89 45 f4                mov    %eax,-0xc(%ebp)
 8048c69:   e8 53 04 00 00          call   80490c1 <uniqueval>
 8048c6e:   8b 55 f0                mov    -0x10(%ebp),%edx
 8048c71:   39 d0                   cmp    %edx,%eax
 8048c73:   74 0e                   je     8048c83 <test+0x30>
 8048c75:   c7 04 24 f0 a3 04 08    movl   $0x804a3f0,(%esp)
 8048c7c:   e8 9f fc ff ff          call   8048920 <puts@plt>
 8048c81:   eb 40                   jmp    8048cc3 <test+0x70>
 8048c83:   8b 55 f4                mov    -0xc(%ebp),%edx
 8048c86:   a1 20 e1 04 08          mov    0x804e120,%eax
 8048c8b:   39 c2                   cmp    %eax,%edx
 8048c8d:   75 21                   jne    8048cb0 <test+0x5d>
 8048c8f:   8b 45 f4                mov    -0xc(%ebp),%eax
 8048c92:   89 44 24 04             mov    %eax,0x4(%esp)
 8048c96:   c7 04 24 19 a4 04 08    movl   $0x804a419,(%esp)
 8048c9d:   e8 ae fb ff ff          call   8048850 <printf@plt>
 8048ca2:   c7 04 24 03 00 00 00    movl   $0x3,(%esp)
 8048ca9:   e8 a0 07 00 00          call   804944e <validate>
 8048cae:   eb 13                   jmp    8048cc3 <test+0x70>
 8048cb0:   8b 45 f4                mov    -0xc(%ebp),%eax
 8048cb3:   89 44 24 04             mov    %eax,0x4(%esp)
 8048cb7:   c7 04 24 36 a4 04 08    movl   $0x804a436,(%esp)
 8048cbe:   e8 8d fb ff ff          call   8048850 <printf@plt>
 8048cc3:   c9                      leave
 8048cc4:   c3                      ret

08048cc5 <getbuf>:
 8048cc5:   55                      push   %ebp
 8048cc6:   89 e5                   mov    %esp,%ebp
 8048cc8:   83 ec 38                sub    $0x38,%esp
 8048ccb:   8d 45 d8                lea    -0x28(%ebp),%eax
 8048cce:   89 04 24                mov    %eax,(%esp)
 8048cd1:   e8 32 01 00 00          call   8048e08 <Gets>
 8048cd6:   b8 01 00 00 00          mov    $0x1,%eax
 8048cdb:   c9                      leave
 8048cdc:   c3                      ret

最佳答案

Is this even possible?

不是如果 Data Execution Prevention正在行动。

the buffer will have already been popped off

POP/RET 不会改变堆栈上的任何数据。它仅更改堆栈指针 SP,而数据保留在原处,直到被 PUSHCALL 替换。

这就是为什么 bug 喜欢

int* foo() {
  int i = 123;
  return &i;
}

在错误显示之前似乎可以工作一段时间。在堆栈上的位置实际被覆盖之前,数据仍然存在不确定的时间。

关于c - 如何执行放在栈上的机器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33237786/

相关文章:

c++ - undefined symbol : _ZL22__gthrw_pthread_cancelm error

c - Mac 上的 SetPixel 等效项?

gedit中c结构的自定义文本颜色

linux - 在运行任何代码之前发生段错误

c - c编译器如何处理无符号和有符号整数?为什么无符号和有符号算术运算的汇编代码相同?

java - 在 Android 中使用阻塞队列创建缓冲区类

C 的国际象棋游戏,对齐问题

c# - 整数声明汇编差异

c++ - glBufferData 和 glBufferSubData 偏移量

node.js - 将 NodeJS 缓冲区转换为整数