PWN_ret2text,ret2syscall,ret2shellcode
首先了解下Linux中的保护机制(具体的绕过等后续再说)
1.canary(栈保护)
在函数开始时就随机产生一个值,将这个值CANARY放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲区溢出覆盖ebp或者ebp下方的返回地址时,一定会覆盖掉CANARY的值;当程序结束时,程序会检查CANARY这个值和之前的是否一致,如果不一致,则不会往下运行,从而避免了缓冲区溢出攻击。
2.NX(no execute)
数据不可执行。原理是将数据所在内存页标识为不可执行,防止因为程序运行出现溢出而使得攻击者的shellcode可能会在数据区尝试执行的情况。NX是对栈和堆的一种保护机制。实验需要关闭NX和地址随机化,否则执行shellcode时,CPU就会抛出异常,而不是去执行恶意指令。
Linux系统叫做NX,Windows系统中类似的机制叫DEP(Data Execute Prevention)。
3.PIE(position-independent executables)
地址随机化。
4.ASLR
代码部分地址无关
Ret2text
首先file和checksec一下:
ida打开:
观察到有个vulnerable()函数:
还有个后门函数:get_shell()
gdb打开,main处下断点后跟进,输入12345678后查看stack:
此时ebp= 0xffffd108,
将黄色与红色全部覆盖后填入get_shell()的地址。
exp如下:
getshell:
ret2shellcode
首先file和checksec一下:
发现rwx并且没有开NX保护,所以代码在堆,栈上可以执行
进入IDA查看,发现这题并没有后门函数,将gets到的s拷贝到buf2.
查看buf2所在的bss段是否可执行
main处下断点后run起来,此时ebp=0xffffd118!
exp如下:
shellcraft.sh()是一段shellcode,ljust()是左对齐,不足处用a填充,画图来说就是这样:
ret2syscall
首先file和checksec一下:
这题是静态链接的,所以比较大,
ida查看,有/bin/sh,但是没有system函数,
Linux的系统调用通过int 80h和寄存器来实现,其中eax存放系统调用号,过程如下:
1.先将系统调用号放入eax
2.将该函数需要的其他参数存入其他寄存器
3.出发0x80中断(int 0x80h)
所以我们需要一些pop和ret指令,这些小片段叫gadget,可以使用ROPgadget这个工具,
本次要用到的:execve(“/bin/sh”,0,0)
eax = 0xb --->系统调用号
ebx = address of "/bin/sh"
ecx = 0
edx = 0
可以看到有许多gadget,选一些有用的就OK。
gdb调试,ebp:0xffffd128
exp如下:
画图来说就是:(下图并不是上面exp的图)