LitCTF 2024 heap-2.27(Tcache attack啦)
0x00 前言初见Tcache,好像没有想象中的难,所以这篇文章篇幅不太长,属于随便写写吧。吐槽:这个甚至有点简单 0x01 速通思路主要是一个 unsorted bin 来泄露 libc 基地址,然后利用 Tcache 来 malloc 任意地址,通过编辑堆这个功能组合成任意地址写,将 free_hook 写成 system, 然后 free 一个内容为 binsh 的堆 0x02 前置准备题目给了 libc 文件,可以通过: strings libc-2.27.so | grep 'ubuntu' 来找到合适的 libc 版本。版本为:2.27-3ubuntu1.6_amd64。patch 一下然后正式开始 0x03 分析一下越来越懒了,现在打堆题都懒得 checksec 了:很多保护,但是不要紧,先看看 ida:经典菜单堆,大致看了一下,有 uaf:没有堆溢出啦,但是 2.27 中加入了 Tcache 一机制,Tcache 可以理解成没有大小的 fast bin。大致看一眼 CTFWIKI Tcache attack...
当无脑将__malloc_hook覆盖成one_gadget但所有one_gadget都打不通的时候该怎么做
0x01 前言做到这题的时候想到一个严重的问题,这种菜单堆题以前我都是怎么做的呢?都是通过堆溢出/uaf 在 __malloc_hook 附近伪造一个 fake chunk 然后将其申请下来,再通过堆编辑来将原本的 __malloc_hook 覆盖成 one_gadget。尝试运行一遍打不通,就换一个 one_gadget,但是其实我没有想过为什么会打不通以及当所有 one_gadget 都打不通的时候怎么办? 0x02 如何解决? 学到了一个新的手段,我们可以利用 realloc 来调整栈帧,在网络上搜索到了一篇博客,大佬详细解释了我上面的问题以及如何解决,现在用一道会有这种情况的题目来实际操作一下,题目是PolarCTF2023秋季个人挑战赛的Emo_chunk 0x03 分析:Checksec:Patch 过了,顺便吐槽一下这个靶场好多堆题都不给 libc 版本,但是看官方解说视频又不说为什么用他那个版本,看到视频里用的是 libc.2.23 就用 2.23 来 patch 了。上 ida:典型菜单堆题,而且有 shell 函数:但是我一开始没有看到,用了...
小萌新的第一次堆溢出+fast bins attack
0x01 前言:题型是一个利用堆溢出来实现Fastbin Attack的题啊,十分适合入门理解,孩子啃得很香。原题目是PolarCTF2025春季个人挑战赛的bll_ezheap1,一道入门堆题。记得堆题上来就要patch!版本之间会有些莫名其妙的差异,很多情况下会导致你本地打不通。 0x02 patch 一下:貌似小版本之间的区别是没有的,这里因为找不到太过远古的ubuntu16的版本,就选择了ubuntu16.04,在glibc-all-in-one中可以找到: 2.23-0ubuntu11.3_amd64 题目没给怎么办?总有方法泄露的 ldd pwn2linux-vdso.so.10x00007ffce117c000libc.so.6 => /home/liiinkle/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.60x00007f592fc00000 /home/liiinkle/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so...
[NewStarCTF 2023]srop
0x01 前言:Srop 初体验,总体上是要利用到pwntools集成的对于srop攻击的工具。 0x02 分析:先来 checksec: 0x03 Syscall你变了,你变得……上 ida 看看:是两个系统调用,但是参数非常奇怪,通常来说 rax 是装载系统调用号的,但是这两个调用里面 rax 都是 0,注意到在第一次 syscall 的时候,第二个参数在 rdx 上,给我的感觉就是传参的寄存器总体往后一了一位。先 gdb 看看怎么回事:步入了 syscall 函数里,一目了然了,主要动了手脚在这里 跟我们猜的一模一样,rdi 的值赋给 rax,rsi 的值赋给 rdi,也就是传参的寄存器总体后移了一位。接下来回到 main 函数,简单看看它做了什么:大概翻译了一下是这样两行函数,read 函数有溢出点,一般来说这样的题可能可以打 ret2csu,但是会在构造某个寄存器的值上会十分麻烦,所以这里着重介绍一下 srop,在程序中翻了翻可以找到: 0x04 调用号0xf是什么?看到这样一句,找了一下对应的系统调用: 打 srop...
GHCTF_PWN部分题解
想说的话:作为一个练习时长半学期的PWN小萌新, 正好来打打这个GHCTF。看了下主办方说是新生赛,实际上他们面向的对象是练习了一学期的新生,所以有些题看到的第一时间还是比较懵的,不过好在最后成功做出来了5 / 8题,还算可以吧。PWN学习之路还很长,慢慢坚持就好了。 1.Welcome come to the world of PWN0x01 前言:签到题,简单的ret2text和pie 0x02 分析:check一下:有pie,上ida看看:直奔主题,这里可以溢出,再看看有没有可以用的:发现了后门函数,而且跟main函数是连续的,所以只需要覆盖两个字节就能绕过pie 0x03 EXP:from pwn import *from ctypes import *context(log_level = 'debug', arch = 'amd64', os =...
ez_pz_hackover_2016
0x01:前言vc哥通过这题给我讲解了很多pwn题的细节,通过写这题的wp简单的记录一下,题目本身一个strcmp绕过+ret2libc 0x02:题目分析check:没有NX?ida看看吧:跟进header():继续往下看:可以看到fgets()但是读取的长度不足以溢出,继续往下看,发现有个vuln函数,跟进:发现memcpy()且第三个参数很大,可以溢出,那么我们要构造的payload就是先绕过chall()函数里面的strcmp(),最后做个ret2libc: printf_got=elf.got['printf']printf_plt=elf.plt['printf']chall_addr=0x08048603payload=b'crashme\x00'+b'a'*(0x32+4-8)+p32(printf_plt)+p32(chall_addr)+p32(printf_got)debug()sla('>...
[VNCTF2 025]Fuko's starfish
0x01:前言主要还是加密算法识别,花指令识别,dll反调试(非必要) 0x02:分析比赛版当中的分析题目提供了一个exe以及一个dll,exe无壳,ida启动:暂时没看到flag的密文,考虑硬玩ing第一个是猜1到100的随机数,第二个游戏是贪吃蛇怎么操作噢在dll里面这里接收输入贪吃蛇游戏界面,wasd操作我先玩玩还有一个,先在ida里面翻一下好像是这个函数,有花:去一下flag密文应该是这一串, 就是那个while(里面的byte_1800A890) unsigned char ida_chars[] ={ 0x3D, 0x01, 0x1C, 0x19, 0x0B, 0xA0, 0x90, 0x81, 0x5F, 0x67, 0x27, 0x31, 0xA8, 0x9A, 0xA4, 0x74, 0x97, 0x36, 0x21, 0x67, 0xAB, 0x2E, 0xB4, 0xA0, 0x94, 0x18, 0xD3, 0x7D, 0x93, 0xE6, 0x46, 0xE7}; 看起来明文长度应该是16,...
[西湖论剑 2025]BitDance
0x01 前言:遇见的第一题没有附件的RE题,原来这种题目叫黑盒测试? 0x02 分析题目只给了一个靶机,连接上去之后提示输入:(没存图片,这里借队友的用一下)输入不同长度的字符串会提示Wrong length, 总之先把长度给爆破出来,这里可以使用python的pwn库,也就是pwn常用工具pwntools: //字符长度爆破脚本from pwn import *context(log_level = 'debug', arch = 'amd64', os = 'linux')xihu='139.155.126.78'stop=1text_len=''while(stop): p = remote(xihu,24847) text_len+='a' p.sendlineafter('Welcome to dance: ',text_len) if b'Wrong' in...
[NewStarCTF 2023]canary
0x01 前言:初见Canary保护,主要还是了解Canary的原理以及如何绕过 0x02 分析:check: 可以看到开了canary保护 原理是在一个函数的入口,先从fs/gs寄存器中取出一个四字节(eax)或者八字节的rax的值存在栈上(最低位都是\x00),当函数结束是会检查这个栈上的值是否和存在去的值一致,若一致则正常退出,如果是栈溢出或者其他原因导致canary的值发生变化,那么程序就会执行___stack_chk_fali函数,继而保护程序 我们先打开ida看看:可以看到有printf, 大致的思路就是通过字符串格式化漏洞, 把字符串的偏移给找出来, 然后通过下面的read做栈溢出, 正常溢出到后门函数, 但是在溢出的时候我们把canary的值给修改了, 所以在构造payload的时候需要注意payload的结构, 首先我们先执行下这个程序:可以看到字符串的偏移是6, 接下来用gdb看看canary在哪里, 我们先在main函数的call printf这里下一个断点:首先启动gdb, 输入 gdb ./canary 打上断点: pwndbg>...
SUCTF_SU_BBRE
0x01 前言:小弟第一回参加SUCTF,只打了day1,这题算是re的签到吧,很可惜最后也没有做出来,就差了中间地址跳转这一步 0x02 分析:上来是一大段汇编, 可以选择硬看或者问ai去让他转换成一个c语言 .text:004021DD.text:004021DD ; =============== S U B R O U T I N E =======================================.text:004021DD.text:004021DD ; Attributes: bp-based frame fuzzy-sp.text:004021DD.text:004021DD ; int __cdecl main(int argc, const char **argv, const char **envp).text:004021DD public main.text:004021DD main proc near ; DATA XREF:...