自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 kernel源码分析 do_msgsnd && read_msg

笔者分析的源码是v 5.11.22。

2024-11-02 19:36:34 411

原创 kernel-learn:源码解析

从kernel pwn的角度,我们不能释放一个无效地址,至少对于slab管理器而言,但是我们可以释放slab管理器管理的页的任意地址(或许有对齐,但笔者还没看到)。所以说,当我们释放一个object的时候,kernel判断它属于的page是否属于slab分配器管理。是否属于 slab 分配器(slab allocator)管理的内存。会根据给定的x查找出相应的page结构体。是 Linux 内核中的一个宏,用于判断给定的。unlikely是编译预测分支优化,不用管。是一个将虚拟地址转换为。

2024-11-01 19:43:14 289

原创 kernel-learn:msgrcv源码解读

就是先将msg->security给free掉,然后循环free掉msg_msg,通过伪造security指针可以构造任意释放,当然,也可以看到,如果msg_msg有security指针的话,我们不能随意覆盖,必须要覆盖合法的堆地址,不然可能kernel panic。因为我们的mode是SEARCH_NUMBER,所以msgtyp是与count比对,而不是msg_msg->m_type,count每轮加一,所以我们传入的mtype实际就是序号,从0开始。这是源码,接下来我们一步一步分析。

2024-11-01 16:57:41 593

原创 CVE-2022-0185

这是一个关于整型溢出的CVE。这是触发漏洞的函数,size每次都增加,会在 page_size-size-2发生溢出,由于size是unsigned类型,会下溢成一个极大数。具体介绍可以看本文主要介绍提权方法。

2024-11-01 01:02:13 1123

原创 修改pipe_buffer的大小

但是很多时候,我们操作的是kmalloc-64,kmalloc-512,类似于这样,当然,可以提供msg_msg的next指针指向kmalloc-32,kmalloc-1k来泄露kbase,但是无法很好的提权。PAGE_SHIFT表示页大小的偏移量,就是12,所以就相当于nr_slots=size/x01000。kernel pwn 中,我们知道pipe_buffer占据的是kmalloc-1k。这里可以看到,resize的时候,会先分配新的buf,然后释放原来的buf。

2024-10-31 13:10:30 350

原创 Linux kernel 4.20 BPF 整数溢出 复现

bsauce大佬是用'xchg eax,esp',但是这需要观察寄存器,而这个内核镜像'add rsp'这个gadget很足,所以我还是采用pt_regs这种打法。所用的是kmalloc-256,考虑覆盖下一个堆块。很明显就是覆盖下一个bfp_queue_stack的函数表指针,没开smap,所以可以在用户空间伪造。rbp这个寄存器不能修改,不然会报错说0xa00000010这个地址不能访问,r15能不能访问没去试,毕竟寄存器已经够用了。说实话,看bsauce大佬的github,BPF模块的漏洞貌似挺多。

2024-10-29 08:40:05 382

原创 d3kheap

这题还能反复写,其实比CVE更简单,这个exp一次性打成的概率是1/2左右,因为qu[0]的主消息的下一个不一定也是msg_msg,但其实可以预先堆喷一些msg_msg,直接让UAF的object在充满msg_msg的页中即可,不过我懒得这样搞了。这道题一开始没做出来,后来复现了CVE-2022-0995,发现两道题其实是一样的。

2024-10-28 20:36:58 324

原创 CVE-2022-0995复现 (kernel CVE)

先堆喷4096个msg_msg,第一个消息为kmalloc-96,第二个为kmalloc-1k,然后释放中间几个,因为我们堆喷了大量的object,cache中的内存页可能被我们用的差不多,我们再去分配创造OOB的object,此时会向buddy system请求,就不可能OOB了,所以我们释放前面几个,让几个full page重新变成partial page,更有利于创造OOB。这一步也是成功了,据我观察,只要第一步OOB成功了,后面基本都能成功!这是第一个复现的完整的CVE,记录一下。

2024-10-27 23:58:38 1060 1

原创 Asis2020_SharedHouse

一道经典的off-by-null构造UAF。做题时我假设kaslr,smep,smap,kpti全开。漏洞在此处,off-by-null。并且我们只能分配 ,kmalloc-32,kmalloc-64,kmalloc-128三种object。

2024-10-16 23:25:30 365

原创 SCTF2024 kno_puts

1. msg_msg直接read的时候会释放,这也是我们想要的,但这是要确保msg_msg的security字段是正常的,根据观察,这个字段的正常值和page_offset_base的偏移是固定的,所以只有泄露page_offset_base的基址即可。很明显,race_condtion的问题,但是只有一次free的机会,kaslr,smep,smap,kpti等保护全开,但是random_freelist没开。2. tty_struct的结构体的前八字节不能改变,不然write会失败。

2024-10-15 08:42:33 247 1

原创 CISCN2022-cactus

这就想到了同样为kmalloc-1k的pipe buffer,可以越界读pipe buffer的op表,这是个全局变量,读出这个就能根据偏移计算出kbase了。很明显了,用UAF修改msg_msg的m_ts字段来越界读。很明显,之前说了,没有看ramdom_freelist,我们可以把msg_msg的m_ts改大一点,顺便泄露下一个object的next指针,就能知道堆的地址啦。注意,这道题中object的next指针不在0x0的位置,在很里面,最好msg_rcv后全都打印出来,别数了,容易数错。

2024-10-13 21:27:09 344 1

原创 WKCTF 2024 easy_heap

不能 free,那首先想到就是 house of orange泄露Libc基址,然后unsortedbin attack。很经典的house of orange + unsortedbin attack +FSOP+ 变量覆盖。但是只能show(8),就不能用largebin的套路来泄露堆地址了,那怎么办呢?我们注意到这是>,但下标一般是从0开始,所以可能会有变量覆盖,我们看看。

2024-07-14 19:09:18 623 9

原创 CISCN--西南半决赛--pwn

然后会执行到这里,逻辑就是在v0上写shellcode,不过执行写0x10,不够sh,很明显要先read。这是主函数,数一下就发现可以溢出最后的0x4008d0。

2024-06-28 20:17:49 328

原创 emoji_call_read

一开始我还以为是因为覆盖了got表里面比较重要的数据,后来发现就是不能直接system,要用系统调用,无论如何这个方法是不行的,我们换一个。要注意的是发送一定要用send,不能sendline,不然会崩溃报错,读不进去数据,我也不知道为什么,很神奇,以前貌似遇到过。read 0x20,意味着即使我们栈迁移也执行写2个gadget,不行,处理rdi然后system起码也要三个。main函数中的这个gadget就很棒,将rbp-0x10处的东西打印出来,后面再执行vuln。这道题我觉得可以记录一下。

2024-06-16 13:56:15 450

原创 scanf&malloc

之前知道scanf输入过多时会触发malloc,这次进行系统地记录。

2024-06-04 20:07:13 485 1

原创 BUUCTF--[V&N2020 公开赛]warmup

在不指定rsi的情况,open会直接将rsi里面的值作为flag值,而rsi里面有时候存着地址,是一个极大值,可能会引起一些意想不到的问题。例如这题中,执行rop的时候rsi存着的是buf的地址,是一个极大值,一开始我没有pop rsi为0,导致执行了好几遍都没法orw成功,加上了pop rsi 0才成功读出flag。有沙盒,分析了一下,write的count不等于0x10就可以,0x30什么的都可以。怎么办呢,细心的小伙伴会发现我们知道libc的基址,那可以写在libc的bss上面啊。

2024-05-30 19:28:17 370

原创 CISCN --EzHeap

思路清晰了,将下一个0x420大小的chunk给free掉,这样fd段就是usbin地址,然后用edit将当前chunk和下一个chunk的size段和pre_size填满,然后show(),就能全都打印出来,就能泄露libc基址了。所以,整体就是:泄露libc基址--->计算出environ地址-->泄露堆地址--->覆盖fd-->分配到environ-0x200的位置-->泄露栈地址-->覆盖fd-->分配到栈上-->写入rop链。使用的方法是environ泄露栈地址,然后在栈上构造orw的rop链。

2024-05-28 13:54:20 439

原创 DragonKnight CTF &&angstromctf--pwn

看我的exp也知道我本来尝试orw也没成功,直接系统调用execve倒是成功了,也不知道背后原理。可用0x40119b这个gadget重复写,并且末尾有leave,顺便栈迁移。这道题有点奇怪,直接用system打是打不通的,考虑堆栈平衡也打不通。

2024-05-25 13:42:46 561

原创 malloc_consolidate

此文章用于详细介绍malloc_consolidate。众所周知,fastbin一般是不能合并,但在malloc_consolidate中是个例外。

2024-05-15 14:58:56 670

原创 HNCTF-PWN

直接看危险函数,不能溢出,只能覆盖ebp。后面紧接的又是leave,ret很明显是栈迁移,通过printf打印出ebp,通过偏移计算出栈地址。通过gdb调试,偏移是0x38。

2024-05-12 10:09:23 780 1

原创 pwn周记 && environ && patchelf

这个标识符存在于libc中,保存当前程序的环境变量地址,也就是包含栈中的一些地址,可以通过打印environ中的内容获取栈的地址。之前为了图方便,一直使用clibc改变二进制文件的libc,但是这样改变会导致符号表没有导入。这样你在gdb的时候输入。然后在glibc-all-in-one中下载相应的libc,这样的指令去查询函数或变量位置是无效的。需要引入debug文件才能查询符号表。最好的做法是在先查询libc具体版本。这样就能查询各函数和变量了。打印exit_hook地址。最后直接引入ld和整体路径。

2024-05-05 15:50:26 379

原创 pwn--realloc [CISCN 2019东南]PWN5

其中,ptr是指向之前分配的内存块的指针,size是要分配的新内存块的大小(以字节为单位)。当需要增加内存空间时,realloc会分配一个新的更大的内存块,然后将原内存块的内容复制到新块中,并释放原内存块;当需要减少内存空间时,realloc会尝试将内存块的大小减少到新的大小,并返回调整后的内存块地址。但通过gdb调试发现,堆块大小为0x20,也就是说malloc(0),malloc(8)和malloc(0x10)效果其实是一样的,由于fd指针和bk指针,一个chunk的大小至少是0x20。

2024-04-25 13:23:49 510

原创 [巅峰极客 2022]smallcontainer

第二点,当你释放被覆盖的chunk是,它会去向后检查能否合并,后面一个chunk的地址是当前chunk的地址加上size,但是你的size域减少了0x10,程序就找不到下一个chunk的pre_size和size域,所以要edit一下,布置一下下一个chunk的头部。很明显off-by-null漏洞,可以将前一个chunk分配为0xf8,然后将0xf8都填满,后一个chunk若size域为0x211,由于小端序,最低位为'\x11',就是17,会被覆盖成'\x00'。这题我认为是比较有思考意义的。

2024-04-24 20:20:43 372

原创 largebin结构探究&&堆分配机制

在许多文章上看到若在fastbin和smallbin中找不到相应大小的堆块,会将fastbin进行合并。但经过我的测试,fastbin貌似并不会合并,根据做题经验fastbin也不会合并,不然这么uaf。所以我认为堆的分配顺序应该是:1.在fastbin和smallbin中寻找有没有大小正好的,若有则直接分配,若没有,进入2.2.在unsortedbin中寻找,从尾部开始,遍历过的堆块放入smallbin和largebin中,0x400为分界,直到找到大小正好的,分配,若没找到,进入3.

2024-04-22 14:30:24 597

原创 以[GKCTF 2020]domo为例来看off-by-null

首先,由于是off-by-null,所以你被off的chunk的大小必须是0x100,0x200这样,因为一字节会直接覆盖十六进制的低2位,你如果是0x80,会直接变成0x00,会出现错误。这是还要注意一点,合并之前一定要先释放掉要合并的最底下的chunk,让它的fd和bk域有相应的地址,因为合并的时候会进行unlink,如果bk和fd区域是乱七八糟的东西肯定会报错。这是off-by-null之后,变成了0x100,当这个chunk被free的时候就会认为前面有个0x130的空闲chunk,会进行合并。

2024-04-18 19:19:42 804 3

原创 [羊城杯 2023 决赛]arrary_index_bank

有用的函数就是查询和更改,且index

2024-04-15 13:22:46 696 1

原创 pwn 周记

一般套路就是uaf,释放unsortedbin后,show(),获取libc的基址。然后获取free_hook或malloc_hook的地址,通过tcachebin或fastbin的伪造堆块,实现地址任意写。存在明显堆溢出漏洞时,可以通过unlink实现地址任意写。注意观察堆块的结构,多用gdb调试,查看unsortedbin与malloc_hook的距离,一般是0x60左右,在malloc_hook周围找到 0x7f的字段作为fake fastbin的size域。

2024-04-14 13:02:53 325 1

原创 pwn --堆

libc 2.26开始引入tcache,不过对tcache的doublefree与伪造没有任何限制,可以很轻松拿到信息。libc 2.29开始引入 tcache的doublefree检测,检查 bin->bk 指针是否是tcache_struct,可以通过堆溢出或uaf绕过。ubuntu16默认用的是libc 2.23,没有tcachebin;ubuntu18是2.27,有tcachebin,但没有任何检测,更加轻松;ubuntu20用的是2.31。

2024-04-12 13:18:26 482

原创 [GKCTF 2021]Checkin

首先肯定要泄露基址,但是s1第一个0x8是'admin\x00\x00\x00',所以可用的实际只有0x18。第二次读入输入'admin\x00\x00\x00'*3+one_gadget+(buf)就可以了。s1和buf都以‘admin\x00'开头就可以了,buf最多只能覆盖rbp,此函数执行完之后就是。此题我本来使用的是之前一题的libc.so.6,一直打不通,后来用了题目提供的才成功。这个0x4018B5就刚刚好,能直接执行puts,再重新执行一遍读入的函数。s1能写一些exp,一眼迁移到s1。

2024-04-11 11:26:50 1101

原创 蓝桥杯训练--旅行家的预算

思路:在一个站点往后找可以触及的站点中油价最便宜的。如果最便宜的比现在的站点便宜,那就买正好能到那个站点的油。如果比现在的站点贵,那就把油买满,然后去那个站点。这是题目描述,标签是贪心。

2024-04-08 19:05:22 306 1

原创 pwn--攻防世界 pwn1

canary一般是以'\x00'结尾,但是由于小端序存储,我们会先遇到'\x00',这里使用sendline自动添加的'\n'掩盖'\x00'。思路形成:先读出canary,再读出main函数的返回地址,计算出libc的基址,因为只能填入一个地址,所以就想到one_gadget。观察保护和源码,有canary保护,并且只能溢出8字节,也就是一个地址。我使用的是python3,可能由于python版本问题,我运行的时候要将。然后是读取main函数的返回地址,与这个类似,就不赘述。一个非常便捷的工具。

2024-04-04 21:12:24 641 1

原创 pwn 攻防世界 stack2

当时我检查了脚本很久,确认无误,gdb调试也确实修改了返回地址,但检查汇编代码发现,最后有 lea 指令改变了esp的值。查看源码,发现对修改数组没有做限制,很自然想到一个字节一个字节修改返回地址。要修改system的参数,幸好题目不算太坏,可以找到'sh\x00'字符串。2.做不出题目的时候,可以多看看汇编指令,可能有发现。在这道题耗了很多时间,有很多陷阱,记录一下。这是esp最后的地址,相差了0x10。即使你修改了,也会像这样打不通。这是一开始记录的ebp的地址。所以修改脚本,并且打通本地。

2024-04-04 02:31:43 626 1

原创 XYCTF --PWN

这是学pwn以来遇到的第一个题目较多的线上比赛,记录一下pwn各题wp。

2024-04-02 16:42:49 1225 6

原创 pwn刷题周记

read函数并不会自动在字符串末尾添加'\x00',而puts和printf函数只有遇到'\x00'才会停止打印。你可以输入足够长的字符串来泄露canary或一些关键信息。如果遇到这样的报错,不是因为你libc的库不全,而是你的payload有问题,可以print(io.recv())看看。当没有思路的时候,可以关注汇编代码,可能把一些关键地址存入了寄存器中。未完待续........

2024-03-28 16:25:19 412 1

原创 pwn:堆方面的领悟

在64位的情况下,若malloc类似于0x18,0x28的区域,多出的0x8为下一个chunk的presize区域,在进行堆溢出的时候,要注意这一点,测算好溢出的字节。

2024-03-25 15:23:27 422 2

原创 CTF ---web题思路总结

面对一道web题时,先注意题目名字或者提示。如'eazy_sql'则大概率为sql注入题目。若含有'flask''tornado'等词,可以考虑去搜索这些服务器的历史漏洞。

2024-03-08 16:56:47 3384 1

原创 [NISACTF 2022]popchains

2.构造pop链,_invoke()函数是当此类被作为函数错误使用时触发,所以去寻找将对象作为函数使用的位置,注意到Make_a_change的_get()方法将自身的effort属性作为函数使用,_get()方法是在调用自身不存在的属性时出发。但同时,直接将对象作为字符串拼接,或将其作为一些字符串函数的参数也会触发,观察到Road_is_long类中_wakeup方法将自身page作为preg_match函数的参数,若page为对象,则会触发tostring方法。自此,pop链构造完成。

2024-02-18 11:05:21 840 3

原创 蓝桥杯 蜗牛

所以,从第i-1根杆到第i根杆,需要考虑前一次所用的方式,以及这一次所用的方式。不妨设置三维数组 dp[i][j][k],代表到第i根杆所需的最短时间,j为1,则上一次选择穿越,k为1,则这一次选择穿越。若从最低点走,则需考虑前一次的方式,若前一次也是最低点走,则可以直接走,若前一次选择穿越,则先要从杆子上爬下来。题中可知,从一根竹竿到另一根,可以从最低点走过去,或穿越过去。此为该题题干,提及数组,最少,则考虑使用动态规划。选择穿越也如此考虑。

2024-02-02 22:10:00 577

原创 python 选择客栈 思考与改进

为了算出减少的数量,需要算出在连续中断数,即在连续多少家同色调客栈之间没有可用餐的客栈。若连续5家客栈之间,则减少5*4/2=10家。我设置了near变量,记录最近的可用餐客栈的下标,设置dp二维数组。我首先的想法是先算出所有的可能数,例如如果有10家同色调客栈,那么所有可能数就10*9/2=45种可能。如上代码,当上一个同色调客栈比near记录的下边近时,说明之间中断,中断数加一。这是我在备赛蓝桥杯是在官网上看到的题目,标签是动态规划。以上是全部python代码,若有不理解,可私信我。

2024-01-31 01:49:31 482

原创 ctfshow repaireman 解题流程与思考

我选择把cmd参数设置为这个,将一句话木马写入1.php文件,注意,后缀不能是txt。最后发包,然后用蚁剑连接即可,在config.php中找到flag。通过阅读,发现,就是让request中的cookie的secret的值等于md5('admin'.$config['secret']).要注意的是exec()好像只能执行linux命令行代码,不能直接执行php代码,我在这研究了好久为什么我的php代码没被执行。我对php不太了解,选择用文心一言分析了源代码,大致了解了意思。这是代码的核心板块。

2024-01-24 16:55:59 533

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除