自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ciscn 2025 avm

一个从。

2025-01-08 18:05:21 1016 4

原创 rust逆向初探

NOTE]秘诀1:一个函数在**被调试运行(F8)**之后,,那么我们当前所在的函数肯定不是真正的main函数。秘诀2:所以存在flag(无论加密前后)的内存区域,都要首先打上硬件。秘诀3:在c语言层面,对临时变量、局部变量等的修改,在一定会反映到对内存空间的修改上。

2024-11-15 10:18:43 1206

原创 android开发

来显示指定的fragment页面,在Fragment_MainActivity2中定义OnClickListener接口中的。

2024-11-15 10:10:14 671

原创 SROP验证

额外关注一下函数的调用栈上,__restore_rt是直接从函数头开始的,说明调用signal_hand函数的不是 restore_rt函数,而是内核直接安排在栈上,用来执行完signal_hand信号处理函数后直接恢复进程原来的上下文,来模仿一个call 指令(将返回地址入栈)之后,会执行一系列的 pop 指令恢复相应寄存器的值,当执行到pop rip 时,就会将程序执行流指向 syscall 地址,根据相应寄存器的值,此时,便会得到一个 shell。上面的例子中,我们只是单独的获得一个 shell。

2024-10-10 21:40:00 1245

原创 malloc源码分析之 ----- 你想要啥chunk

如果通过brk扩容的空间是连续的(想对上次的top chunk顶地址),则直接更新原来top chunk的size即可。通过前面的调试,可以看到,直到进入这里都没有对 large bin中本身的chunk(这里的fwd->fd的值) 的fd\bk_nextsize字段进行检查,所以即使修改了上面的值 也不会影响程序。将fastbin中剩余的chunk放入到tcache的过程中,对fastbin中的chunk没有检查(没有对size的检查),但是有tcache 了的话,一般不会用fastbin。

2024-10-04 19:08:50 1220

原创 free源码

tcache在控制chunk进入对应的链时,是根据其释放时 size字段的大小来确定,所以可以将较小的chunk的size字段值改大,将其释放进入较大的tcache链中,再申请出来时就能造成overlapping(这种方法一般用在fastbin中,因为fastbin中取出chunk时 会检查size字段)。前,在调用free前都会检查free_hook中是否存在指针,如果指针存在就会直接去执行对应的函数,此时的rdi值就是释放的chunk地址(准确来说是。

2024-09-21 11:51:10 912

原创 ld_addr + UAF漏洞修复

这条路径只需要修改_rtld_local结构体的值,并且让 _IO_2_1_stderr的vtable check不通过即可,libc上的 _IO_list_all或者stderr等都不用覆盖,覆盖的值都只存在于ld上( _IO_2_1_stderr 的vtable字段可以用tcache取出chunk时next指针自动清0完成,不需要向上写值)如果vtable check不通过,会走_dl_addr,在 _dl_addr中会调用到 在exit_hook中利用的那个函数指针,此时的。

2024-09-10 11:23:31 1424 2

原创 house of emma

house of cat 实际上任然是利用 IO_FILE 的指针,其中一个思想就是连续伪造两个IO_FILE :第一个覆盖fs:0x30,第二个 来覆盖 函数指针。如果在其他利用时,需要绕过加密,就可以采用这种方法。(走house of cat其实是一种更好的选着,只需要伪造一个IO_FILE即可)

2024-09-07 16:32:42 1355

原创 house of cat

house of cat主要的摸底还是覆盖vtable指针,因为在glibc-2.24之后堆vtable新增了检查,导致直接覆盖vtable为system行不通,所以需要利用_IO_jump_t中的函数(这样能绕过vtable的判断)来挟持程序的控制流。glibc 2.24 下 IO_FILE 的利用,house of cat可以通过伪造IO_FILE走FOSP或者**__malloc_assert** 来完成攻击。

2024-09-03 22:01:48 1348

原创 exit_hook和setcontext

exit_hook在pwn题中的应用 - 不会修电脑 - 博客园 (cnblogs.com)exit_hook :是程序在执行exit函数时,会去该位置拿一个函数指针,进而执行的一段程序,如果能修改掉这个函数指针就能挟持程序的控制流,执行想要的gadget。exit(0);return 0;这里用libc-2.32.so演示一下exit的调用过程:先进__run_exit_handlers函数:这里会调用到**_dl_fini函数** ,进入:_dl_fini函数开头的for循环中就调用到了。

2024-09-01 17:07:45 1521

原创 house of pig

House of Pig 是一个将 T和FSOP结合的攻击,同时使用到了进行辅助。主要适用于 libc 2.31 及以后的新版本 libc 并且程序中仅有 calloc来申请chunk时。(因为 calloc 函数会跳过 tcache,无法完成常规的 tcache attack 等利用,同时,因为程序中没有 malloc 函数也无法在正常的之后,将放入 tcache 中的 fake chunk 给申请出来 )。house of pig 的核心其实是利用large bin attach。

2024-08-29 12:31:16 1072

原创 Large Bin Attack 源码调试

how2heap 中也说了,large bin attack 是未来更深入的利用(在IO中利用其能写入堆地址)。现在我们来总结一下利用的条件:可以修改一个 large bin chunk 的 data从 unsorted bin 中来的 large bin chunk 要紧跟在被构造过的 chunk 的后面通过 large bin attack 可以辅助 Tcache Stash Unlink + 攻击(任意地址写入一个堆地址。

2024-08-26 17:52:18 1146

原创 glibc 2.24 下 IO_FILE 的利用

在 2.24 版本的 glibc 中,全新加入了针对 IO_FILE_plus 的vtable 劫持的检测措施,glibc 会在调用虚函数之前首先检查 vtable 地址的合法性。首先会验证 vtable 是否位于_IO_vtable 段中,如果满足条件就正常执行,否则会调用_IO_vtable_check 做进一步检查。otherwise,if (__glibc_unlikely (offset >= section_length)) // 超出范围#endifreturn;

2024-08-22 16:38:30 1093

原创 House of Roman / malloc_printerr间接调用malloc函数执行malloc_hook

House of Roman 这个技巧说简单点其实就是和结合的一个小 trick。该技术用于,利用 12-bit 的爆破来达到获取 shell 的目的。且仅仅只需要一个 UAF 漏洞以及能创建任意大小的 chunk 的情况下就能完成利用。应用场景:没show函数,且got表无法修改。

2024-08-19 18:16:49 682

原创 FSOP,glibc-2.23攻击IO_list_all

FSOP 是 File Stream Oriented Programming 的缩写,根据前面对 FILE 的介绍得知进程内所有的 _ IO_FILE 结构会使用 _ chain 域相互连接形成一个链表,这个链表的头部由_IO_list_all维护。FSOP 的核心思想就是劫持_IO_list_all 的值来伪造链表和其中的_IO_FILE 项,但是单纯的伪造只是构造了数据还需要某种方法进行触发。FSOP 选择的触发方法是调用_,这个函数会刷新_IO_list_all 链表中所有项的文件流,相当于。

2024-08-16 22:54:40 1027

原创 FILE 结构

FILE 在 Linux 系统的标准 IO 库中是用于描述文件的结构,称为文件流。FILE 结构在程序执行 fopen 等函数时会进行创建,并分配在堆中。我们常定义一个指向 FILE 结构的指针来接收这个返回值。0&&==0x20001||一共大小为:0xE8进程中的会通过**_chain 域_IO_list_all** 表示,通过这个值我们可以遍历所有的 FILE 结构。。因此在初始状态下,(指针) 指向了一个有这些文件流构成的链表,但是需要注意的是这三个文件流位于。

2024-08-12 21:59:25 668

原创 House of Orange

House of Orange 的利用比较特殊,首先需要目标漏洞是堆上的漏洞但是特殊之处在于题目中不存在 free 函数或其他释放堆块的函数。我们知道一般想要利用堆漏洞,需要对堆块进行 malloc 和 free 操作,但是在 House of Orange 利用中无法使用 free 函数,因此 House of Orange 核心就是通过漏洞利用获得 free 的效果。malloc_printerr 函数:voidva_list ap;

2024-08-12 21:51:46 1006

原创 House of Rabbit

House of rabbit 的优点是容易构造 overlap chunk,由于可以基于 fastbin attack,甚至不需要 leak 就可以完成攻击。

2024-08-10 10:27:54 652 4

原创 伪造unsortedbin释放时 top chunk的衔接问题

释放一个unsorted bin:首先判断是否与top chunk相邻,相邻则直接回归top chunk然后,判断与其相邻的chunk是否被释放:低地址处的chunk,直接用当前待释放的chunk的prev_inuse判断。高地址处的chunk,用下下个chunk(高地址)的prev_inuse位来判断。判断如果相邻的chunk也被释放的话,就会和待释放的chunk合并(要对前面判断的已释放的chunk进行完整性检查)如果相邻的chunk都未释放。

2024-07-31 19:16:48 520

原创 House of Lore

能修改small bin中chunk(victim)的bk指针:victim–>bk=fake_chunk1。要能伪造两个fake_chunk1、fake_chunk2,修改fake_chunk1的fd和bk指针,修改fake_chunk2的fd指针:fake_chunk1–>fd = victim 且 fake_chunk1–>bk = fake_chunk2最总实现的效果是,实现任意地址分配chunk:分配到fake_chunk1。

2024-07-29 19:24:22 912

原创 House Of Force

首先,需要存在漏洞使得用户能够控制 top chunk 的 size 域。其次,需要用户能自由控制 malloc 的分配大小。第三,分配的次数不能受限制。其实这三点中第二点往往是最难办的,CTF 题目中往往会给用户分配堆块的大小限制最小和最大值使得不能通过 HOF 的方法进行利用。

2024-07-29 11:53:16 703

原创 tcache attack

Tcache Attacktcache让堆利用更加简单:tcache回顾:在 tcache 中新增了两个结构体,分别是 tcache_entry 和 tcache_perthread_struct:/* We overlay this structure on the user-data portion of a chunk when the chunk is stored in the per-thread cache. */typedef struct tcache_entry{

2024-07-28 12:18:45 476

原创 tcache attack

在 tcache 中新增了两个结构体,分别是和其中有两个重要的函数,和这两个函数会在函数和的开头被调用,其中tcache_put当所请求的分配大小0x4087。7再复习一遍在tcache_get中,仅仅检查了,此外,我们可以将 tcache 当作一个类似于 fastbin 的单独链表,只是它的 check,并没有 fastbin 那么复杂,仅仅检查。

2024-07-25 18:05:06 1086

原创 NSSCTF[堆][tcache]

就会直接从该栈地址处再取出指令的地址执行,即取出我们构造的ORW指令的地址:

2024-07-24 17:16:30 717

原创 unsortedbin attack

(因为unsorted_chunks(av)地址本来就知道,不需要用过链尾的p去找它的下一个即fd值),所以即使我们修改了其为一个不合法的值也没有关系。然而,需要注意的是,unsorted bin 链表可能就此破坏,在插入 chunk 时,可能会出现问题。类似于unlink的过程,要将链尾的chunkp,取出来,即 unsorted_chunks(av)->bk = p->bk;我们可以看到,在该链表中必有一个节点(不准确的说,是尾节点,这个就意会一下把,毕竟循环链表实际上没有头尾)的。

2024-07-19 12:05:00 1118

原创 Unlink

下面我们首先介绍一下 unlink 最初没有防护时的利用方法,然后介绍目前利用 unlink 的方式。

2024-07-18 19:38:10 952 1

原创 BUUCTF[堆][of_by_one]

首先需要拿到一个堆地址,后续才能在伪造book结构体的时候有地址使用:先写入32字节的author name,将name的32个空间占满(由于此时booklist中还未写入book结构体地址,所以后续写入的地址会覆盖最后第33个字节的b"\x00",从而在输出的时候泄漏堆地址),再申请一个book,但是book的大小如何控制呢?首先我们申请的长度要恰好到下一个chunk的size字段,所以必须将下一个chunk的prev_size字段沾满,不能留空隙,所以申请的大小必须为。

2024-07-15 12:02:20 691

原创 NSSCTF[堆][Unlink]

题目地址:[

2024-07-13 21:42:38 1077

原创 NSSCTF[堆][tcache]

题目地址:[

2024-07-13 13:05:21 1548

原创 NSSCTF[堆][tcache]

题目地址:[参照:https://nuoye-blog.github.io/2021/05/16/466a7375/

2024-07-12 19:04:38 768

原创 BUUCTF[堆][unsortbin]

利用double free的方式泄漏出unsortbin中的main_arena地址。释放一个不属于fast bin 的 chunk,并且该 chunk 不和 top chunk 紧邻时,该 chunk 会被首先放到 unsorted bin 中。当有一个(或几个)(不属于fastbin)时,small/large chunk 的 fd 和 bk 指向中的地址。

2024-07-11 17:15:44 936

原创 pwn入门--格式化字符串

gdb中格式化字符串在栈上的位置的,就是偏移。

2024-07-11 17:12:49 955

原创 BUUCTF[堆][of_by_one]

此时再申请一个大小为0x30的chunk2,就会将fastbins[0x40]分配给我们(但是实际的大小只有0x18,但是写入的大小就是0x30了),可以导致chunk之间的覆盖(变向堆溢出)。但是如何填充数据泄漏libc地址呢?首先我们申请的长度要恰好到下一个chunk的size字段,所以必须将下一个chunk的prev_size字段沾满,不能留空隙,所以申请的大小必须为。最后free(0)即可拿到flag。这种情况才能占满(将。

2024-07-09 16:29:33 469

原创 堆溢出ret2libc

利用思路,先申请2个heap,用heap0的edit函数来覆盖heap1的content地址使其指向存放put函数地址的堆空间,再调用heap1的show函数,即可泄漏put函数的真实地址。成功覆盖,put函数在调用时会直接用支付穿输出0x000055df3bd91080处的内容,遇到b’\x00‘才停止。利用栈溢出覆盖put参数泄漏libc基地址,再第二次用system的地址覆盖put函数,实现ret2libc。

2024-07-08 17:37:27 395

原创 BUUCTF[PWN][fastbin attack]

在0x00000000006020E0-0x33处刚好有一个空间中存储着0x7f,可以将地址0x6020ad作为伪造堆,那么0x7f就是size字段的值了,只要我们申请的空间为。先申请三个堆,大小为0x68(实际分配的大小为0x7f),再释放掉heap2,利用heap2进行fastbin attack,实行任意地址申请堆(刚才找到的伪造堆)后面直接编辑heap0,就能将free的got表上的值,修改为system的plt。之所以不直接覆盖为system的got表是因为函数调用的过程,如果之前。

2024-07-07 18:27:26 1287

原创 Canary,三种优雅姿势绕过

如果利用栈溢出将最低位的b’\x00’覆盖,就可以利用答应函数将canary一致输出,最后再在最低位拼接上。逐次覆盖掉canary的4个字节(一位无法绕过低位字节堆高位进行爆破,所以必须从低到高),且要求canary不能变化,绕过重开程序canary变化,就不适用爆破了。在进行栈溢出时,如果程序开启了canary保护,首先就需要泄漏这个随机值,否则其被覆盖掉后,程序在退出时再检查该值,会引发错误。注意:canary爆破时,利用栈溢出,溢出到canary位置,从。首先确定要覆盖的位置,由于是。

2024-07-06 18:55:09 1259 1

原创 hitcontraining_uaf

再看一下del_note函数:先是检查了一下index的范围,再检检查一下当前的notelist列表上是否为空,即检查add时第一步申请的空间的指针,后续释放了两次的空间,但是有个问题:该notelist表还没有清空,指向这个地址的指针还存在于notelist中。,覆盖掉了第一次申请的堆(0x20大小)中存放的print_note_content函数的地址,如果此时直接调用print_note,就会执行我们输入的值所指向的地址出的代码,所以直接用。此时仔细观察,就会的发现我们第三次输入的值。

2024-07-05 21:25:59 812

原创 [pwn]静态编译

程序在ida打开后,左侧的函数栏目没有红色(系统调用的函数),而只有一些静态函数,通常这类文件的大小会必普通的pwn题程序要大得多。这种静态编译的题没有调用库函数,也就没有使用libc,自然我们也没法泄漏libc的基地址,可以直接使用ROPgadget来搜索,利用程序中的一些指令片段,来拼凑出的效果。

2024-07-05 19:42:31 778

原创 strcpy,srtcmp,strlen函数漏洞利用

ida查看,题目给了一个栈溢出漏洞,虽然给了0x200的长度,但是后面用户strlen检查了输入的长度不能超过0x50,溢出长度明显不够。后买你getflag函数中存在一个strcpy函数漏洞,可能可以进行栈溢出,动态调试观察其栈上的变化,可见只要。但是可以利用strlen函数判断字符串时以。

2024-07-05 19:39:53 1108

原创 栈复用(覆盖栈上的有用数据)

观察程序给的两个输入点:一个读name、一个读password,读name不用看(输入那么的前面根本没用函数能利用),仔细看一下读password:程序给的输入长度是0x4f,但是要想覆盖到返回值需要0x70长度,很明显不够,s的长度只有8,所以是存在溢出的,能覆盖掉栈上的其他数据,所以观察一下后续程序中是否有对 **该函数栈的重利用 **。是password_checker函数直接赋值的,所以password_checker函数利用不了,但是她的栈会在后面调用 *函数赋给v7的,并且最后传递出来的是。

2024-07-05 16:35:24 996

空空如也

空空如也

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

TA关注的人

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