shellcode
1.前提:在函数调用栈上的数据有可执行的权限并且关闭ASLR
2.可用msf生成
3.shellcode是用来打开shell的攻击指令,是软件漏洞中一线段用作攻击载荷的代码,会启动命令行的shell来达到执行命令的操作
4.payload = padding1 +address of shellcode +padding2+shellcode
5.address of shellcode起始的地址,可用若干"/x90"代替
6.可使用mmap开一段可执行的空间,将shellcode放入进去执行
7.使用mprotect将一段空间设置为RWX,将shellcode放进去执行
8.return2shellcode,将shellcode插入栈中,然后return到buf
return2libc
1.含有libc库
2.目标:在内存中确定某个函数的地址,并用其覆盖掉返回地址
2.思路:由于libc的动态链接库中的函数被广泛应用。所以可以利用libc库包含的(一般是system)系统级的函数来获取当前进程的控制权,执行的函数需要参数,例如system("/bin/sh")
3.payload = padding1+address of system + padding2+address of '/bin/sh'
4.ldd可以查看目标程序调用的so库
5.read/write/puts
6.strings -a -t x libc-2.19.so | grep "bin/sh" readelf -a ./libc-2.19.so | grep "system@"
ROP
1.如果想连续执行若干端指令,就需要每个gadget执行完毕可以将控制权交给下一个gadget,所以gadget的最后一步是ret指令
2.payload = padding1+address of gadget1 + address of gadget2+....+address of gadget n
3.对于单个gadget,pop所传输的数据应在gadget之后
4.假定输入溢出数据不收“/x00”字符的影响,所以payload可以直接包含"/x7d/x00/x00/x00"(传给eax的参数125)
5.程序中的一些pop/ret的代码块称之为gadget->用来平衡堆栈
6.绕过ASLR
7.gadget需要是的rdi的值指向“/bin/sh”的地址
Hijack GOT
1.目标:在内存中修改某个函数的地址,使其指向另一个函数
2.思路:修改其他函数地址使其指向system,这样修改之后程序内对该函数的调用就相当于执行system函数
3.程序对外部函数的调用需要在生成可执行文件时,将外部函数链接到程序中,链接的方式有两种,静态链接和动态链接。静态链接得到的文件包含外部函数的全部代码,而动态链接得到的可执行文件并不包含外部函数的代码,而是在运行时将动态链接库加载到内存的某个位置。