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

此题完

相关推荐
传奇开心果编程26 分钟前
【ArkUI进阶练中学】第11课:安全与合规进阶
学习·ui·华为·harmonyos
山下梅子酒2251 小时前
洛谷-入门-B2079
c语言
Mr_Macallon2 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
hasty3 小时前
2026-10-04_ABSENTIA鉴权不变量审计_CSDN_待发布
安全
sunoo-2293 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
wuminyu3 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
Felven4 小时前
B. Reverse a Permutation
c语言
Logic1014 小时前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
kaiyou20264 小时前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习
知识分享小能手4 小时前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习