shellcode原理:
shellcode通常使用机器语言编写,是一段用于利用软件漏洞而执行的代码其目的常常让攻击者获得目标机器的命令行shell而得名。
shellcode根据他是攻击者控制他所运行的机器,还是通过网络控制另一台机器,可以分为本地和远程两种类型有时攻击者注入目标进程中的字节数是被限制的,因此可以将shellcode分阶段进行,由前一阶段比较简短的shellcode将后一阶段比较复杂的shellcode下载并执行。
栈溢出原理:
由于C语言对数组引用不做任何边界的检查,从而导致缓冲区溢出(buffer overflow)成为一种常见的漏洞。根据溢出发生的内存位置,通常可以分为栈溢出和堆溢出。由于栈上保存着局部变量和一些状态信息,一旦发生严重的溢出,攻击者就可以通过复盖返回地址来执行任意代码,利用方法包括shellcode注入、ret2libc、rop等。
在之前的博客中有提到,函数以栈的形式调用,在每个栈的底部有rbp指针和我们的返回地址,如果溢出足够多的字节,就可以将rbp指针和返回地址给覆盖,当函数执行到返回地址时就可以按照我们所设计好的地址跳跃到目标函数继续执行获得shell。
rop链原理:
对于rop原理我学得磕磕碰碰,(老师讲得有点模糊)主要是一个地方没讲好,希望后来人别被卡住。
最开始要利用栈溢出,只需要将返回地址覆盖为jmp esp的指令地址,并在后面添加shellcode就可以执行 后来引入了NX缓解机制,数据的所在内存页被标记为不可执行此时再执行shellcode就会抛出异常,所以注入新的代码并不可行,那么就复用程序中已有的代码。
于是rop链技术就诞生了使用rop链就要先扫描文件,提取出可用的gadget片段(通常以ret指令结尾)的地址(划重点),然后将这些gadget根据需要的功能进行组合达到攻击者的目的(刚开始老师没讲清楚是地址,导致我一直在自己猜想怎么拼接的)。
这里附一张图更好理解:
也就是覆盖返回地址为gadget的地址,跳到gadget片段上执行在此gadget的地址下附上另一个gadget的地址,以此类推连成rop链。
如图pop rdi完rsp向下跳一格,并继续执行return指令实现/bin/sh_的函数调用获取shell。