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

时间:2019-08-13 23:37:49

标签: stack system-calls buffer-overflow execve buffer-overrun

我正在学习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字节的hack覆盖了一个24字节的缓冲区。字节将替换缓冲区之外的堆栈存储器地址处的值,包括指向其自身在堆栈中较高位置的可执行代码的返回地址。但是,有意代码在内存中占用了其他数百个其他堆栈字节,从而破坏了不相关的外部作用域进程的堆栈帧。有了这些被破坏的堆栈帧,当...

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

2)外栈框架的上下文已被破坏,那么在shell命令提示符下输入“退出”后系统如何继续正常运行?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

如果我们讨论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指令以请求OS执行指定的系统调用。因此,一旦int 0x80全部返回后,执行是否继续继续取决于系统调用是什么

通常,读取,写入,打开,创建等均全部执行并返回。但是,exec类的函数(转到man exec)是不同的。这些功能中的每一个都永远不会成功返回。他们只会在失败时返回。

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

我希望这能回答您的问题。