largebin_attack例题
西湖论剑 Pwn Storm_note比较经典的一道largebinattack的pwn题
查保护
glibc是2.23的,也没有去符号表
静态分析
存在后门,输入666执行后门,我们输入的内容和0xABCD0100处比较,相同即可getshell,这个地址里的值是init_proc中写进去的随机值,所以我们要么泄露出这个值,要么修改这个值,才能输入通过
这里也不存在泄露信息的函数,所以基本要修改掉这里面的值了
并且程序还开了mallopt(1, 0),在ptmalloc2中,mallopt(1, 0)的作用是禁用fastbin
漏洞点在edit函数里存在一个off-by-null
我们主要利用此漏洞触发unlink,构造堆重叠
漏洞利用先建7个chunk
123456789add(0x18) #0add(0x508) #1add(0x18) #2add(0x18) #3add(0x508) #4add(0x18) #5add(0x18) #6
然后伪造一个pre_size防止chunk2的presize被破坏无法unlink,再释放1
12345edit(1, b'a ...
Largebin_attack初探
Largebin_attack初探Largebin相关知识largebin 是指在 glibc 的堆管理中用于管理较大的堆块的数据结构。x64下largebin 的范围是 size > 0x400(x64)如果是libc 2.27及以上,其实0x400到不了largebin,而是tcache的范围,所以,在libc 2.27中,一般使用0x420,但是如果可以将0x400的tcache填满,也是可以申请到largebin的
large bin采取了分段的存储,比如第一个范围就是0x400到(48<<6),即0x400到0xc00,而其中,每个链表之间大小差为(1<<6)=0x40,结果如下:
如何获得largebin我们释放一个大chunk时,它不会直接进入largebin,而是先进入unsortedbin中,接下来如果我们申请一个更大的堆块,这个释放进unsortedbin的chunk无法满足需求时,就会被释放进largebin
largebin内部:因为largebin,一个bin内部并不是一个size,所以需要fd_nextsize与bk_next ...
Protobuf pwn学习
Protobuf pwn学习Protobuf简介Protobuf是一种语言无关、平台无关、可扩展的数据序列化格式。它的全名是Protocol Buffers,由Google开发并用于解决数据的编码、传、存储等问题。Protobuf是一种高效的数据压缩编码方式,可用于通信协议,数据存储等它由一种用于声明数据结构的语言组成,然后根据目标实现将其编译为代码或另一种结构,一旦定义了要处理的数据的数据结构之后,就可以利用 Protocol buffers 的代码生成工具生成相关的代码,甚至可以在无需重新部署程序的情况下更新数据结构只需使用 Protobuf 对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对你的结构化数据轻松读写。
下面通过一道例题来进一步学习一下
2022祥云杯 protocol
拖进IDA查字符串可以看到protobuf这样的字符串
这题是静态链接且去除了符号表逆向分析起来难度非常大,我们先导入sig
1strings pwn | grep 'ubuntu'
20.04对应的glibc2.31去找相匹配的签名文件:https://git ...
100days_0ctf_babyheap
100days_0ctf_babyheap前言我把这道pwn题归到我的个人感悟这个类别中,且标题前面是100days
没错可能已经有读者能猜到,这道题是我100天前入门堆利用的第一道题,在8月的最后一天,在公司实习无聊时,再次做了一下100天前让自己无从下手,望而生畏的堆题,第一次做的时候真的是打击信心,险些想放弃学习pwn,但是现在再看,轻舟已过万重山,这题做起来已经非常得心应手了,属于一眼出思路,而且我又把当时参考的wp拿出来看了一下,甚至觉得自己写的这份exp更简单粗暴,从一开始对着wp都一知半解,到自己流畅地独立完成getshell,中间相隔100来天,挺多感慨,坚持不断的pwn学习不仅让我有技术层面的进步,还让我找到了一份不错的实习机会,伙食补贴,交通补贴,每周还有两次下午的盒装水果,且薪资甚至高出不少大厂的日薪,算是第一次真的意义上感受到学习带给自己的好处,如果现在的你迷茫不知所措,请停止焦虑,静下心来,你只管坚持,终会有一天你会和我一样看到坚持下来的意义,可能不是100天,只要50天,也可能200天,但是不管多久,总有这么一天
再探0ctf_babyheap先放两个当初我 ...
orw_heap
orw_heap(堆上的orw)setcontext介绍pwntools 自带了一款可以控制寄存器值的工具,它实质上就是依靠 setcontext 来实现的
libc低版本2.27:
一般我们将free_hook或者malloc_hook地址的内容替换为setcontext+53,也就是mov rsp, [rdi+0xA0]这行代码,之后调用钩子函数的时候就会从这行代码开始执行。从这行代码往后,我们可以看到汇编代码修改了很多寄存器的值,因此使用setcontext可以方便的设置环境上下文。这里我们着重关注一下修改rsp和rcx寄存器的两行代码,mov rsp, [rdi+0xA0]和mov rcx, [rdi+0xA8]。修改rsp的值将会改变栈指针,因此我们就获得了控制栈的能力,修改rcx的值后接着有个push操作将rcx压栈,然后汇编指令按照顺序会执行截图中最后的retn操作,而retn的地址就是压入栈的rcx值,因此修改rcx就获得了控制程序流程的能力。
例题:ciscn_2021_silverwolf
123456789101112unsigned __int64 sub_E ...
orw_incomplete
orw_incomplete(不完整的ORW)标准orw就是read,open,write,但是可能有时候其中的r,o,w也会被禁用
OR 缺 W例:2021-蓝帽杯初赛-slient
这里需要root权限才能检查sandbox,普通权限无法检查
只允许read,open,没有write
1234567891011121314151617181920212223// about mmap (link: https://man7.org/linux/man-pages/man2/mmap.2.html)// 1. SYNOPSIS#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);/* 2. DESCRIPTION mmap() creates a new mapping in the virtual address space of the calling process. The starting ad ...
orw_stack
ORW_stack(栈上ORW)概述:沙盒机制也就是我们常说的沙箱,英文名sandbox,是计算机领域的虚拟技术,常见于安全方向。一般说来,我们会将不受信任的软件放在沙箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造成任何危害。 在ctf比赛中,pwn题中的沙盒一般都会限制execve的系统调用,这样一来one_gadget和system调用都不好使,只能采取open/read/write的组合方式来读取flag。
开启沙箱的两种方式在ctf的pwn题中一般有两种函数调用方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp库函数。
prctl函数原型:
12345678910111213141516// 函数原型#include <sys/prctl.h>int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);// option选项有很多,剩下的参数也由option确定,这里介 ...
hitb2017_1000levels(利用vsyscall滑动Bypass PIE)
hitb2017_1000levels(利用vsyscall滑动Bypass PIE)查看防护措施
没开canary,开了PIE,应该能利用到栈溢出漏洞
本地调试
hint里面看着没什么东西,go里面两次输入然后回答问题
IDA静态分析
show_hint == 0 是放在bss段的,且开了PIE地址随机化,这里目前来看是没有什么办法去修改其为1,不过
不论show_hint为几,system的地址都会被写到rbp-0x110的位置
我们看一下go的逻辑
v4没有初始化,如果我们第一次输入的数大于0,才会使v4 = num,而且v4也是rbp-110h处的数据,由于这个函数和hint函数都是在主函数里依次调用的,它们的rbp是同一个,只是在不同时刻使用而已。那么,如果我们先执行一次hint,再进入这个函数,那么v4就会存储着system的地址
进入存在栈溢出漏洞的level函数看一下
rbp压栈,rsp抬高0x40此时的栈空间是这样的:
如果我们能把ret,rbp-0x120,rbp-0x118滑掉,那么不就执行system了吗?然而,system函数需要一个参数,并且x64使 ...
Ret2dlresolve分类讨论
Ret2dlresolve(从No RELRO到FULL RELRO)RELRO保护策略上一篇ret2dlresolve博客中也提到了,这里再写在开头
NO RELRO保护未开的情况,所有重定位段均可写,包括.dynamic、.got、.got.plt
Partial RELRO部分开启保护,其为GCC编译的默认配置。.dynamic、.got被标记为只读,并且会强制地将ELF的内部数据段 .got ,.got.plt等放到外部数据段 .data、.bss之前,即防止程序数据段溢出改变内部数据段的值,从而劫持程序控制流。虽然.got标记为只读,但是.got.plt仍然可写,即仍然可以改写GOT表劫持程序控制流
Full RELRO继承Partial RELRO的所有保护,并且.got.plt也被标为只读。此时延迟绑定技术被禁止,所有的外部函数地址将在程序装载时解析、装入,并标记为只读,不可更改。此时不需要link_map以及dl_runtime_resolve函数,则GOT表中这两项数据均置为0,此时ret2dlresolve技术最关键的两项数据丢失,并且GOT表不可写。
No lea ...
Ret2dlresolve
Ret2dlresolve学习时光Ret2dlresolve原理启用动态链接的程序在调用函数时,会使用延迟绑定技术,即外部引入的函数真正调用时才会去解析该函数的虚拟地址,而这个动作实际上是需要通过got, plt表以及各个动态相关段来实现。
当第一次调用某外部引入函数(如read,system等)时会调用_dl_runtime_resolve(linkmap, offset)进行函数地址解析,当得到某函数的具体加载地址后会回写got表项再直接调用该函数。
而Ret2dlresolve攻击则是 在这一解析函数的过程中,对相关的结构体进行伪造,并通过控制参数或者结构体指针使得解析函数的具体逻辑能够找到我们构造的结构体,并解析出一个危险的函数地址,达成执行任意函数的目的。
具体的,动态链接器在解析符号地址时所使用的重定位表项、动态符号表、动态字符串表都是从目标文件中的动态节 .dynamic 索引得到的。所以如果我们能够修改其中的某些内容使得最后动态链接器解析的符号是我们想要解析的符号,那么攻击就达成了。
RELRO12345RELRO(Relocation Read-Only)重定位段只读 ...




