我正在学习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命令提示符下输入“退出”后系统如何继续正常运行?
任何帮助表示赞赏!
答案 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
)是不同的。这些功能中的每一个都永远不会成功返回。他们只会在失败时返回。
问题的最后一部分,因为已经删除了内存布局并加载了新内容,所以这里没有缓冲区溢出的迹象,也没有内存损坏。
我希望这能回答您的问题。