2021 羊城杯 Writeup
Whats your nameoff by null 漏洞
会申请一个堆块来管理,里面会写一个函数和内容堆块地址,off by null 堆重叠之后控制这个结构体,实现任意地址读写
free hook 写入 setcontext 栈迁移到堆上 orw
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120from pwn import *context.log_level = 'debug'context.arch = 'amd64'context.os = 'linux'def ad ...
2021 祥云杯 Writeup
JigSaw’sCage开始菜单 make choice 输入有个整形溢出,将 v4 改得比 0xe 大,进入 else 分支 mprotect 给 heap 段加上 rwx 权限
test 运行 shellcode rdx 是堆地址,利用这个将 /bin/sh 地址传到 rdi ,然后 syscall getshell
EXP12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn import *context.log_level = 'debug'e = ELF("./JigSAW")context.binary = ep = process(['./JigSAW'])#p = remote("47.104.71.220",10273)def add(idx): p.sendlineafter('Choice : ','1') ...
house of banana通用exp
https://www.anquanke.com/post/id/222948
适用场景
满足任一条件即可
测试最新 glibc 2.31 及以下都可以
程序能够显式的执行exit函数
程序通过libc_start_main启动的主函数,且主函数能够结束
原理分析
海师傅原文分析很详尽:https://www.anquanke.com/post/id/222948
补充一点,largebin attack 源码,glibc 对只有这部分没有新增补丁都能适用这个方法:
模板EXPexp 题目基本可以通用,特殊的就是 rtl_global 和伪造结构体的 payload 第二个写入值随 glibc 版本变化有所变化:
123456789 这个值 +----------------------+ | | payload = p64(0) + p64(libc_base + 0x221730) + p64(0) + ...
2021 allesctf writeup
jumpy给出程序是个解释器,设计愿意只能写入:
mov eax, xxx
jmp xxx
ret
对于 jmp 会用一个列表保存跳转的地址,运行 shellcode 之前会检查这些地址的汇编是不是限制的那三个。
漏洞地方在 mov eax, xxx 写入数值的时候没有检查数字,可以写入长度是 4 字节。搭配上 jmp 利用错位可以执行任意汇编。下面是错位例子:
123456789101112131415161718192021# 输入代码jmp 1; mov eax,0xb8; mov eax,0x90f63148# 错位 mov eax,xxxx +-----------+jmp 1 mov eax,0xb8| |+---+ +-----------+ || | | | |eb 01 b8 b8 00 00 00 b8 xx xx xx xx| ^| |+--- ...
vsyscall滑动绕过
vsyscall 介绍vsyscall 和 vdso 被设计用来加速系统调用的处理
vsyscall 的工作原则其实十分简单:Linux 内核在用户空间映射一个包含一些变量及一些系统调用的实现的内存页。
vsyscallt 特点:
vsyscall页面在每个进程中是静态分配了相同的地址;
分配的内存较小;
只允许4个系统调用;
vdso 特点:
提供和vsyscall相同的功能,同时解决了其局限。
vDSO是动态分配的,地址是随机的;
可以提供超过4个系统调用;
vDSO是glibc库提供的功能;
vsyscall 地址特性vsyscall分配的地址固定不变,不受 aslr 和 pie 影响,固定在:
1ffffffffff600000 - ffffffffffdfffff (=8 MB) vsyscalls
系统 aslr 打开,程序保护全开
vsyscall提供的系统调用导出 vsyscallGDB 运行程序,打断后导出内存数据:
1dump memory ./vsyscall 0xffffffffff600000 0xffffffffff601000 ...
PWN-WAF
a823c777a879d41ec09881931b08d975e5bd8443bc44689c2ca9c7a6f84f9fcbe5b675aef81d36f36f87f3803706ebdce153d76a1d7c8c018c83de82d330f9b95655f9f3d54dd07568a62dc9b62938f5e35d7caae7df37ed5af48b6e6b7b1a0e93f583e8ac905521c390e5a303a5c3b40b33c4e9848367dc464087dcd234d73312d33559790a9e849891940b3c50775d7e3eacdb12c7403358fe4e4da84a33293ba1f3c7e7647765632c1bddaafaff85cc03a1a99c879329ae09e9c871ab40607bdf4e5b719d959eaa2b8334f4929be7ef0b5da0deb1ad76b7316f75a1d67f1a08495d87c3a40c60603418241c3d46a9f5790f7b8324f31b0 ...
2021 蓝帽杯决赛 writeup
secretcode去年决赛、今年线上初赛题目、今年决赛还是这题,一题 3 次
考点还是那样 open read 通过延时爆破 flag ,这次沙箱就多了个规则需要 fd 大于 0x14 才能调用 read ,多写一个 while 循环的事情
由于多了 while 循环 flag 位置变了一下,直接从第二个字符开始爆破
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374# encoding=utf-8from pwn import *file_path = "./chall"context.arch = "amd64"# context.log_level = "debug"context.terminal = ['tmux', 'splitw', '- ...
2021_巅峰极客Writeup
mimic-game拟态题目,语言实现同一个程序,最后通过 obs 同时运行。
Mimic32 guess 输出的时候有个栈溢出:
程序是 32 位、RELRO 是部分保护 ret2dlsolved 利用,直接套 pwntools 生成 payload 模板:msgparser
12345678910111213141516171819202122from pwn import *context.log_level="debug"context.terminal = ['tmux','sp','-h']context.binary = elf = ELF('./mimic32')context.arch = 'i386'p = process("./mimic32")# gdb.attach(p,"b *0x080489A7")# pause()rop = ROP(context.binary)dlresolve = Ret2 ...
ret2dlresolve
ret2dlresolve原理概述linux 动态链接的程序使用 _dl_runtime_resolve(link_map_obj, reloc_offset) 来对动态链接的函数进行重定位。
动态链接器在解析符号(函数)地址时需要使用:重定位表项、动态符号表、动态字符串表等。如果能够修改其中的某些内容,就能使得动态链接器解析的符号(函数)是我们想要解析的符号(函数)。
攻击效果让被攻击的函数变成我们所需要的函数,且被攻击函数 got 表也被劫持为目标函数的地址
使用限制依据保护分几种的
使用场景利用ROP技巧,可以绕过NX和ASLR保护,比较适用于一些比较简单的栈溢出情况,但是同时难以泄漏获取更多信息的情况(比如没办法获取到libc版本)
延迟绑定技术
以下基于 32 位程序,64 位差异不大
ret2dlresolve 需要了解动态链接的基本过程以及 ELF 文件中动态链接相关的结构(段、表)
延迟绑定相关段、表、结构体
结构体定义文件:/glibc-2.23/elf/elf.h
PLT表在程序中以 .plt 节表示
每一个表项表示了一个与要重定位的函数相关的若干条指令 ...
2021红帽杯决赛Writeup
oooohMsgHTTPc语言实现的 http 服务,和路由器固件的一样有个路由表:
/weclome :泄露出 pie
/login_user & /register_user :登录&注册
/add_message :申请堆块
/del_message :释放堆块。根据输入的 message_id 和登录时产生的用户标志判断是否有权限删除对应堆块。
/get_message :选中堆块,将堆块地址赋值到全局变量。根据输入的 secret 和身份标识来判断,当 secret 匹配且身份标识不匹配时,选中堆块。
/empty_message :释放选中的堆块,并置零全局变量。
/show_message : 输出选中的堆块内容
/exit : 退出当前用户,清空用户标识,但保留创建的堆块
从以上功能可以看出来存在 UAF 漏洞:用户 A 申请堆块 1 ,然后切换用户 B 选中堆块 1 ,接着换回用户 A 通过 del_message 释放堆块 1 ,最后用户 B 通过 show_message 泄露 bin 中堆块信息,empty_message 实现 doubl ...