buuctf-pwn axb_2019_fmt32题解(学习过程持续更新)

本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题

此处我将文件命名为pwn

checksec pwn查看一下保护机制

可以看到这是一个32-bit的文件,NX保护开启

将文件拖入ida,按F5将汇编代码转换成c语言代码,得到

read(0, &s, 0x100u)可以输入0x100字节的内容s;

sprintf(&format, "Repeater:%s\n", &s) sprintf 把用户输入s拼接到Repeater:后面再加换行存入 format 缓冲区;

printf(&format)存在格式化字符串漏洞

这个题没有system函数,没有/bin/sh,只有printf(&format)格式化字符串漏洞。所以我们考虑用这个漏洞泄露puts@got中存储的puts函数的真实地址,用于获得system函数的真实地址,然后再次利用这个漏洞将printf@got中存储的地址改成system函数的真实地址,最后写入我们的/bin/sh,达到system("/bin/sh")的效果,所以我们三次循环达成目的。

返回虚拟机

gdb pwn动态调试

可以看到我们输入的AAAA,在第七个参数里有一个A,在八个参数里有三个,被分开了,所以我们输入五个A,看一下

所以我们需要先输入一个A,再输入我们的地址(放在了第八个参数)

nano exp.py 开始写攻击脚本

payload:泄露puts@got里存储的puts函数的真实地址,进而得到system函数的真实地址;

payload2:改写printf@got里存储的地址为system函数的真实地址 ;

fmtstr_payload(8,{printf_got:system_addr},write_size='byte',numbwritten=0xa)

  • 8:格式化字符串漏洞偏移,栈上第 8 个参数指向我们可控输入缓冲区
  • {printf_got:system_addr}:要把printf_got地址改写为system_addr
  • write_size='byte':用%hhn按单字节分次写入,适配 32 位
  • numbwritten=0xa:printf 在遇到第一个%前,已经输出了10 字节 (Repeater:A),工具要基于这个已输出字节数计算%c填充量。

最后发送b";/bin/sh\x00":";" 是 shell 命令分隔符,执行前面无效字符串后直接执行后面的/bin/sh。

#在这里我尝试了用LibcSearcher,但是给出的libc没有一个可以打通。根据题目里给出的这是一个Ubuntu 16,猜测我们需要的是Ubuntu16.04 libc‑2.23‑0ubuntu11 i386这个libc库,询问AI,就得到了固定偏移

puts 0x05f140

system 0x03a940

保存退出

python3 exp.py

cat flag

此题完

相关推荐
外收内放3 分钟前
FastAPI猜字谜实战(5):会话管理
开发语言·python·学习·fastapi
叼烟扛炮6 分钟前
Linux 学习笔记(三十一):线程概念、底层分页机制与初体验
linux·运维·服务器·笔记·学习·1024程序员节
H.莓飛9 分钟前
【数据结构】归并与外排序
linux·服务器·c语言·开发语言·数据结构·visual studio
HY小宝F10 分钟前
智能摄像头系统 30 天学习计划 Day 09:用 RTSP 把视频送到网络
网络·学习·音视频
小猪佩奇TONY12 分钟前
Linux 内核学习(19) --- linux waitqueue
linux·学习·waitqueue
m4Rk_13 分钟前
【论文阅读】Agent记忆机制(111):FEB-30——别再只用问答准确率评估 Agent Memory
论文阅读·人工智能·学习·开源·github
xiaobobo333015 分钟前
关于c语言循环结构的一些思考
c语言·业务逻辑·流程控制·循环结构·移植+输入
vortex517 分钟前
IoT 安全剖析:从消费级摄像头到车联网的攻击面全景
物联网·struts·安全
凉、介19 分钟前
深入理解 ARMv7-M | 异常/中断处理
笔记·学习·嵌入式·arm
Navigator_Z24 分钟前
LeetCode //C - 1304. Find N Unique Integers Sum up to Zero
c语言·算法·leetcode