检查保护机制
1 | checksec ret2text |
1 | Arch: i386-32-little //文件为32位程序 |
canary(栈保护)
当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变);
如果不合法就停止程序运行(栈溢出发生)。
攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。
PIE
如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址
NX(DEP)
NX即No-eXecute(不可执行)的意思,限制一块内存区域不可执行。
ASLR
ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。
0x2
本题是32位程序,对应的是32的IDA。加载出来的是汇编语言,然后就要去看它的main函数按F5反汇编
栈溢出漏洞
简单讲,栈溢出就是向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,造成溢出。
==发生栈溢出的条件== 程序必须向栈上写入数据。写入的数据大小没有被良好地控制
==利用方式== 覆盖程序的返回地址为攻击者所控制的地址,比如该地址为执行shellcode的地址shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,可以让攻击者获得shell,利用pwntools可自动生成,等用到再说。可能造成栈溢出的函数。
==可能造成栈溢出的函数有== gets,scanf,vscanf,sprintf,strcpy,strcat,bcopy
0x3
继续浏览其他函数的伪代码。发现secure函数中调用了system(“/bin/sh”)
我们只需要想办法执行这system(“/bin/sh”)从而拿到我们想要的shell。
我们现在大概确定了栈溢出漏洞,我们首先要知道这个漏洞到底有多深,然后我们了解了这个漏洞的深度把东西填装进去让他覆盖到这个system(“/bin/sh”)这个地址我们就可以得到shell了。
那如何确定这个偏移量和这个地址呢?
step1
利用gdb进行调试看它的偏移
1 |
|
计算的偏移量为112,下面找到system(“/bin/sh”)地址就可以构造exp了,
那么我们看IDA在secure中调用system(“/bin/sh”)的地址
==exp如下==
1 |
|