我正在学习 Linux 下的缓冲区溢出 shellcode 方法。https://seedsecuritylabs.org/Labs_16.04/Software/Buffer_Overflow/
我使用的 shellcode 以 movb $0x0b, %a1 和 int $0x80 结尾。shellcode 执行,我得到我的命令提示符。我读过很多地方 execve 和 int 0x80 “不返回”。好吧.. 好吧,但是当 execve 进程成功并退出时(也就是我在命令行提示符下输入“exit”),~does~ 程序执行流在哪里?
我认为调用程序的堆栈框架已替换为新的 execve 代码信息。新的 execve 代码是否保留了被覆盖进程的返回地址并返回到该地址,就好像它是它自己的一样?(所以它确实有点返回 .. 到借来的地址?)就 int $0x80 而言,在 int 0x80 指令之后的下一个字节处不会继续执行吗?如果不是,下一个字节是什么?
在缓冲区溢出问题和 int 0x80 的上下文中,比如说(例如)一个 517 字节的 hack 会覆盖一个 24 字节的缓冲区。字节将替换缓冲区之外的堆栈内存地址的值,包括指向堆栈中更高的可执行代码的返回地址。但是故意的代码会在内存中更高的 100 个其他堆栈字节上踩踏,破坏不相关的外部范围进程的堆栈帧。使用这些被破坏的堆栈帧,当......
1)当shell从int 0x80返回并执行更多不属于hack的堆栈数据时。现在有什么未指定的字节可能是无效的 CPU 操作码。
2)外部堆栈帧的上下文已被破坏,那么在我的shell命令提示符下输入“exit”后系统如何优雅地继续?
任何帮助表示赞赏!