C 堆栈缓冲区溢出

max_max_mir

我正在尝试复制堆栈缓冲区溢出。这是我的代码

#include <stdio.h>

int main(int argc, char *argv[]) {
  char x[1];
  gets(x);
  printf("%s\n", x);
}

我在 32 位机器上编译它,这意味着每个内存地址是 4 个字节长。由于每个字符是 1 个字节(使用 sizeof 验证),当我输入“AAAAA”作为输入(比 x 可以容纳的多 1 个字节)时,我预计会出现堆栈缓冲区溢出。但是,在我输入 13 As 之前没有任何反应,此时我收到“非法指令”错误。14 导致“分段错误”。

问题

  1. 为什么我在 5 As 时没有出现分段错误?
  2. 非法指令和分段错误有什么区别?
  3. 什么是可视化堆栈的好工具(gdb 除外)?

我看过Trouble replication a stack buffer overflow exploit,但我无法理解答案。

这是我的程序集转储:

(gdb) disassemble main
Dump of assembler code for function main:
   0x0804844d <+0>: push   %ebp
   0x0804844e <+1>: mov    %esp,%ebp
   0x08048450 <+3>: and    $0xfffffff0,%esp
   0x08048453 <+6>: sub    $0x20,%esp
   0x08048456 <+9>: lea    0x1f(%esp),%eax
   0x0804845a <+13>:    mov    %eax,(%esp)
   0x0804845d <+16>:    call   0x8048310 <gets@plt>
=> 0x08048462 <+21>:    lea    0x1f(%esp),%eax
   0x08048466 <+25>:    mov    %eax,(%esp)
   0x08048469 <+28>:    call   0x8048320 <puts@plt>
   0x0804846e <+33>:    leave  
   0x0804846f <+34>:    ret    
End of assembler dump.
j31d0
  1. 堆栈在 main 函数执行后立即对齐 16 字节(在第 3 行)。所以你不能只计算保存的返回地址的确切地址,你可以尝试从 5 个字节到 21 个字节。
  2. 非法指令是与任何定义的指令不匹配的字节。每条指令都用机器代码表示(例如:push ebp 是 0x55 等),但例如, 0xff 0xff 与 x86 机器中的任何指令都不匹配。但是当任何内存访问无效时会发生分段错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C中的堆栈粉碎/缓冲区溢出

来自分类Dev

缓冲区溢出 C

来自分类Dev

C中的缓冲区溢出与获取

来自分类Dev

缓冲区溢出 c(获取函数)

来自分类Dev

c ++缓冲区溢出或损坏的变量

来自分类Dev

C中自发的缓冲区溢出

来自分类Dev

基于堆栈的缓冲区溢出-使用scanf和有限输入的C语言中的挑战

来自分类Dev

在Ubuntu上禁用堆栈保护以防止缓冲区溢出而没有C编译器标志

来自分类Dev

缓冲区数组在C中的for循环中溢出

来自分类Dev

C缓冲区溢出中的链接列表

来自分类Dev

消除线程中的缓冲区溢出(C)

来自分类Dev

消除线程中的缓冲区溢出(C)

来自分类Dev

缓冲区数组在C中的for循环中溢出

来自分类Dev

仅当超出范围时C缓冲区溢出

来自分类Dev

C缓冲区溢出中的链接列表

来自分类Dev

C-缓冲区溢出详细信息

来自分类Dev

C程序char缓冲区意外溢出

来自分类Dev

Linux:简单 C 程序的缓冲区溢出导致 SIGBUS

来自分类Dev

堆栈上的缓冲区溢出

来自分类Dev

查找堆栈缓冲区溢出

来自分类Dev

利用堆栈缓冲区溢出

来自分类Dev

利用堆栈缓冲区溢出

来自分类Dev

关于堆栈缓冲区溢出漏洞

来自分类Dev

基于堆栈的缓冲区溢出

来自分类Dev

堆栈缓冲区溢出检测机制?

来自分类Dev

C ++刷新缓冲区

来自分类Dev

C缓冲区指针

来自分类Dev

Heartbleed错误是C中经典缓冲区溢出漏洞利用的体现吗?

来自分类Dev

修改具有缓冲区溢出漏洞的C函数的返回地址