繁体   English   中英

execve 缓冲区溢出成功完成后的 CPU 执行流程? ..int 0x80 成功完成后?

[英]CPU execution flow after execve buffer overflow completes successfully? ..after int 0x80 completes successfully?

我正在学习 Linux 下的缓冲区溢出 shellcode 方法。 https://seedsecuritylabs.org/Labs_16.04/Software/Buffer_Overflow/

我使用的 shellcode 以 movb $0x0b、%a1 和 int $0x80 结尾。 shellcode 执行,我得到我的命令提示符。 我读过很多地方说 execve 和 int 0x80 “不返回”。 好吧.. 好的,但是当 execve 进程成功并退出时~程序执行流程去哪里了(也就是我在命令行提示符下输入“exit”)?

我认为调用程序的堆栈帧已替换为新的 execve 代码信息。 新的 execve 代码是否保留了被覆盖进程的返回地址并返回到该地址,就好像它是它自己的一样? (所以它确实返回 .. 到借用的地址?)就 int $0x80 而言,在 int 0x80 指令之后的下一个字节是否继续执行? 如果不是,下一个字节是什么?

在缓冲区溢出问题和 int 0x80 的上下文中,比如说(例如)517 字节的黑客覆盖了 24 字节的缓冲区。 字节将替换缓冲区之外的堆栈内存地址处的值,包括指向堆栈中更高位置的自己的可执行代码的返回地址。 但是故意的代码会踩踏内存中更高的 100 个其他堆栈字节,从而破坏无关的外部作用域进程的堆栈帧。 有了这些被破坏的堆栈帧,当...

1)当shell从int 0x80返回并执行更多不属于hack的堆栈数据时。 现在有什么未指定的字节可能是无效的 CPU 操作码。

2) 外部堆栈帧的上下文已被破坏,那么在我的 shell 命令提示符下输入“exit”后,系统如何优雅地继续运行?

任何帮助表示赞赏!

我想如果我们讨论execve是什么以及它是如何工作的,你就会明白发生了什么。

我读过很多地方说 execve 和 int 0x80 “不返回”。 好吧.. 好的,但是当 execve 进程成功并退出时~程序执行流程去哪里了(也就是我在命令行提示符下输入“exit”)?

以下来自execve的联机帮助页。

execve() executes the program pointed to by filename.  filename must be
       either a binary executable, or a script starting with  a  line  of  the
       form:

           #! interpreter [optional-arg]

execve是执行指定程序的系统调用。

继续,

execve() does not return on success, and the text, data, bss, and stack
       of the calling process are overwritten by that of the program loaded.

本声明涉及您的问题。

每个进程都有自己的内存布局。 内存布局由文本段、数据段、堆栈、堆、依赖库等组成,可以参考任意进程的/proc/PID/maps ,可以清楚地了解内存布局。

execve执行并成功时,整个内存布局将被擦除(调用者进程的内容将永远丢失)并将新进程的内容加载到内存中。 新文本段、新数据段、新堆栈、新堆,一切都是新的。

因此,当您尝试在命令行上exit时,您只需终止使用 execve 运行的/bin/sh 没有段错误,没有错误。

新的 execve 代码是否保留了被覆盖进程的返回地址并返回到该地址,就好像它是它自己的一样? (所以它确实有点返回 .. 到借来的地址?)

不,这不会发生。 execve 启动的新进程对旧进程一无所知。

就 int $0x80 而言,在 int 0x80 指令之后的下一个字节不会继续执行吗? 如果不是,下一个字节是什么?

int 0x80指令用于请求操作系统执行指定的系统调用。 因此,一旦int 0x80返回,是否继续执行完全取决于系统调用是什么

一般来说,读、写、打开、创建等,都执行并返回。 但是,函数的exec类(转到man exec )是不同的。 这些函数中的每一个都不会在成功时返回。 他们只会在失败时返回。

问题的最后一部分,因为内存布局已经被擦除并加载了新内容,所以这里没有缓冲区溢出的迹象,没有内存损坏。

我希望这回答了你的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM