自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 BUUCTF babyheap_0ctf_2017

这样就很清晰明了,0x90的地址被释放了两次,由于unsortbins被释放后其中fd指针和bk指针会指向main_arena+88的地址,其中__malloc__hook的地址在main_arena-0x10的地方,我们需要构造一个fakechunk且在__malloc_hook附近,才方便修改。修改成0x31的头部size后,接着又修改回原来的size头部,接着释放掉3堆块,这样就有两个堆指针同时指向3堆块,索引2指向的是3,索引3也是指向的3。在写入数据内容中,没有限制大小,可以进行堆溢出。

2025-07-29 12:22:23 319

原创 ez_heap

这里可以看到我们一开始输入的password是跟buff紧紧贴在一起的,所以我们可以再一开始输入password这里写上0x21,伪造一个size头部,当我们成功再buff处申请成功了地址之后,我们就可以进行任意地址写入,就成功解决问题了,在最后,我发现想拿到shell,是不可以的,因为开了沙箱检测,我们只能使用orw攻击,把flag读出来,这个题保护全开,不过有一个亮点,当我们输入123的时候,他会进行一个变量对比,当buff为deadbeef的时候,就可以进入到gift函数,下面就是我的exp了。

2025-07-15 17:39:43 211

原创 攻防世界 welpwn

这样就可以正常执行我们的rop链了,以下是完整的exp。

2025-04-22 11:34:58 293

原创 BUUCTF hitcontraining_heapcreator

由于该程序没有system,所以我们要泄露libc,通过在0x80这个大小范围内修改掉第三个chunk的地址,泄露出free的真实地址,因为这个题目在我们申请一个chunk的时候实际上他会生成两个chunk,第一个会存放后面chunk的大小和下一个chunk的地址,由于我们有0x81个字节可以覆盖,完全可以把我们之前申请的第二个chunk的地址给改成free_got,这样我们show(2)就会把free的真实地址泄露出来。之后调用edit进行对堆内容的修改,进行堆溢出从而修改下一个chunk的大小。

2025-04-18 17:26:50 479

原创 攻防世界 pwn1

因为canary是通过逆字节存储,而且最后一个字节为\x00,由于puts遇到\x00会进行截断,所以我们用\n来进行覆盖,这里使用sendline所以自带\n不用自己加上去,因为是逆字节存储,所以是用rjust啊啊啊啊,死脑子快记住,因为没记住,在这里卡了好久,泄露完canary之后就是常规的泄露libc了,这里直接给出完整exp。一目了然,输入1就是read栈溢出,输入2就是把刚刚输入的进行打印,看看程序开了什么保护。

2025-03-30 19:47:24 582

原创 攻防世界 pwn-100

一开始我是用cyclic来查看泄露到ret的偏移量的,所以没仔细看c代码,发现我没有后面的payload.ljust()还一直显示让我输入字符,把我看蒙了,仔细看了伪代码才发现在for中一定要输入完200个字节才会退出循环。最后发现可以用来溢出攻击的就只有在40063d函数中,审计代码可以发现a1是通过传入参数v3而来的,所以read是往v3里面输入数据,v3覆盖到返回地址为0x48。

2025-03-29 22:06:03 473

原创 BUUCTF [极客大挑战 2019]Not Bad

我们直接open根目录下的flag,然后把flag的内容读入到mmap中,再用write打印处mmap的值,这里解释一下为什么fd为3,因为我们是打开文件进行读入,0,1,2分别是标准输出,标准输入,标准错误,所以3之后才是打开文件的顺序,所以我们写上3.以下是完整的exp。在main看到这两个比较有用的函数,第一个函数一眼看过去就发现是有沙箱保护的,第二个函数就是正常的栈溢出函数,我们先看看程序开了什么保护。也是第一次做到沙箱的题,也熟练了一点orw的攻击方式。拿到题目放入ida,看看有什么函数。

2025-03-29 15:54:59 535

原创 BUUCTF actf_2019_babystack

这里还是详细的说说栈迁移的具体细节把,首先我们的payload在填充到ebp时,在ebp处填充想要迁移的地址,返回地址上面填leave的地址,这样会进行两次leave的操作,第一次的leave会把ebp弹到想要迁移的地址,第二次的leave,会把esp迁移到ebp的地址,然后再pop ebp,这也是我们为什么要在payload前面写上p64(0)的原因了,就是让pop ebp把p64(0)弹出,不会把我们构造的rop链给弹出。以下为泄露完puts的exp。以下是泄露puts_got表的exp。

2025-03-28 17:03:57 488

原创 BUUCTF ciscn_2019_es_7

里面有这些东西,这个mov rax 15,对于我们构造srop非常重要,因为我们构造srop需要伪造sigreturn调用,而15就是sigreturn的系统调用号,对于系统调用什么函数,取决于rax里面的值,所以这里帮我们把rax设置成15了,所以记录一下这里的地址。srop就是溢出到返回地址,需要先调用sigretrun,在放入我们构造的sigframe,这里需要用bytes(sigframe),不能用str(sigframe),sigframe.rax直接=59也可以。

2025-03-27 13:54:06 933

原创 BUUCTF mrctf2020_easy_equation

有个格式化字符串漏洞,和一个判断judge到后面是不是198就可以拿到shell,原本很多wp都是利用格式化字符串漏洞去修改judge的值,可是我发现这个保护啥也没开,就开了个nx,我直接再fgets栈溢出到返回地址把地址改成system不行吗。直接跳转到system就可以直接拿到shell了。结果发现真的就那么简单。

2025-03-26 22:14:50 205

原创 BUUCTF jarvisoj_level5

主要的函数只有这个,没有后门函数,保护只开了nx,也就是常见的ret2libc的攻击方式,这里主要考的是再64位的传参,这个read肯定是很足够来栈溢出的。我们先用Roggadget来寻找rdi和rsi和rdx的地址,但是找不到rdx的地址,但是我们找到了和rsi连在一起的r15,也可以拿来当第三个参数存放。

2025-03-26 20:58:37 368

原创 BUUCTF others_babystack

因为canay是逆字节存储且最后的字符为”\x00“,puts函数输出的时候遇到\x00会截断输出,所以我们通过最后输入一个\n将\x00给覆盖掉,我们就可以利用puts全部打印出来,我们的sendline()是自带在payload后面加上\n的所以不用刻意加\n,这里用的是rjust()左对齐,也是因为canary是逆字符存储,所以要左对齐用\x00来进行填充,后面就是正常的libc泄露获取system函数地址得到shell了,以下是完整的exp。checksec查看开了什么保护。

2025-03-24 20:54:23 441

原创 BUUCTF axb_2019_fmt32

现在我来解释一下,numwritten指的是前面printf在fmtstr之前已经输入了多少个字符串,因为传入fromat是用sprintf来格式化输出,来写入format的,所以format里面有”Repeater:“这个字符串,加上前面我们为了更好的接收print_got表,还在payload前面多输入了一个‘a’所以在fmtstr之前输出了10个字符也就是0xa,所以要设置成0xa才可以正常拿到shell。“来分隔开,system里面会识别成“Repeater:/bin/sh”这样的命令,只有加上;

2025-03-23 23:08:34 448

原创 BUUCTF ciscn_2019_s_9

通过观察,在ret中执行的jmp esp的操作,指向的是我们最后写上“sub esp,40;call esp”这样的操作,shellcode的位置距离现在的esp为0x28,也就是40,所以要进行“sub esp,40;有个jmp esp的操作,我们可以利用这个指令直接跳转到我们从栈上写入shellcode的位置进行getshell,通过观察栈上的空间太少,pwntool生成的shellcode太长,我们只能手写短一点的shellcode了,以下是exp。checksec一下发现什么保护都没开。

2025-03-23 15:56:15 388

原创 BUUCTF [ZJCTF 2019]Login

通过往前逆向观察汇编,发现被赋值成了var_130依然覆盖不了,继续跟进我们可以看到rdi最终赋值成了rax,跟进最近的一个函数:password_checker,查看rax被赋值成什么。理论上我们直接覆盖var_68成后门函数就可以拿到shell了,可是var_68在s上面,覆盖不到,那我们只能继续观察var_68中被rdi赋值的内容在哪里了。最终发现了rax最终被赋值成了在var_18的位置,终于找到了一个我们可以覆盖的一个位置了,我们只需要将var_18覆盖成后门函数就可以获得shell。

2025-03-22 00:53:09 564

原创 BUUCTF ez_pz_hackover_2016

可以看到我们一开始填入的crashme在0xffa81c90的位置,“cr”的两个字母为0x7263,而我们的ebp处在0xffa81ca8,所以填满ebp需要的字节为0xa8-0x90=24,但是实际上我们在0x90的位置的时候只有后面两个字节才开始写入,所以为24-2=22,再加上32位的程序最后要再加4个字节才能覆盖到返回地址,所以我们的payload需要payload.ljust(26,b"\x00")进行把ebp填满。前面printf出了s的地址,我们先把s的地址接收过来。

2025-03-21 11:48:42 388

原创 BUUCTF ciscn_2019_es_2

BUUCTF ciscn_2019_es_2 的wp

2025-03-20 17:34:54 851

原创 BUUTCTF [Black Watch 入群题]PWN

讲解的是buuctf里面的[Black Watch 入群题]PWN题目

2025-03-20 16:43:23 1028 2

空空如也

空空如也

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

TA关注的人

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