XYCTF 2025 pwn方向部分题解
nailong

int -> uint 如果输入负数就可以绕过“太高了”
接下来0是读,1是写,程序开头给了栈地址
虽然用time0加随机数了,但是只要我们本地也同样跑个time0就可以生成一样的随机数
分别把几个变量写掉后弄出任意读写原语后写orw即可
exp:
1 | from pwn import * |
libc-revenge
莫名其妙的一道题,运行时自动崩溃
修了一遍,结果原来是加难度,我还以为修自动崩溃呢
setvbuf设置了全缓冲
利用puts后rdx=1重置stdin缓冲即可
当然,想那么做需要控制一下rdi和rsi
利用这几个gadgets
1 | 0x000000000040117d : pop rbp ; ret |
然后用rsi、rbp在0x403F50构造出got表地址,传给rdi后调用puts
接着rdi变成stdout,rsi变成0
控制到setvbuf泄露libc地址
接下来栈迁移到bss直接打栈溢出即可
exp:
1 | from pwn import * |
EZ3.0
救命我的程序怎么跑不起来
救命我的qemu怎么不起作用

诶,栈溢出?

诶,backdoor?
那不是秒了吗

可惜是ls,但是我们有

ROPgadgets不能使用,但是我们很轻松就能在backdoor下面找到gadgets

所以开个靶机直接打就行了,栈溢出的题,根本不需要本地调试!(大暴论)
1 | from pwn import * |
我去,舟!
前面的寻访模拟器完全是摆设,哎ctf圈不要再蹭我们方舟了

一个小栈溢出呀
覆盖rbp -> bss栈迁移,然后在bss上写/bin/sh,就可以pop rdi再system乐
1 | from pwn import * |
heap2
朴实无华的板子题,free不清指针,没有edit也很简单呀
我去我板子坏了,这我得站起来打
- 队友:救命!本地打通,远程打不通。
我:救命!板子坏了,把你们的板子给我啊啊啊啊啊啊!
队友:天啊要没时间了,这难道就是传说中的。。。三角洲行动!!!!
我:不是不是你快停下啊啊啊啊啊
/* imiab退出了xyctf */
如何进行堆布局?
显然,要避免使用小堆块,不然会分配到莫名其妙的地方,或者说在我们进行free的时候,对应的tcache已经满了,导致我们的堆进入了奇怪的bins。
由于show和add都有截断,所以没办法直接泄露,但是uaf又弥补了这点,经过简单的布局,我们可以轻松地拿到libc和haddr
1 |
|
然后,借用这个重叠,伪造tcache,free掉后直接打io list all因为感觉在这种乱糟糟的布局里打large很糟心,而且我们也有足够的a数量去打tcache
一开始想要打stdout泄露env然后转打栈,但是失败了io基础不牢固呃呃,不要拷打我口牙
最后就是无聊的调板子时间,因为fake io地址写错和magic填错了,结果没写出来对的我在没有控制栈的情况下找带ret的gadgets
exp:
1 | from pwn import * |
bot
protobuf逆出来以后是这样的:
1 | syntax = "proto2"; |
我以为actionid 1 是add,仔细检查发现是edit
呃,白给的任意读写,感觉随便打了
里面实现了一个类似影子栈的东西,但是感觉非常奇怪。
怎么会有人把内存管理和影子栈这两种功能写到一个结构体里的()
exp:
1 | from pwn import * |
一些碎碎念
第一次发博客,有点,紧张!
xyctf总体打下来
体验似乎不是很好哦
首先是ret2libc没有初始化变量,导致除ubuntu22.04以外系统打开程序都会直接崩溃。后面修了换了附件,结果貌似只修了本地setvbuf设置错的问题(我的猜测,实际上我也不知道修了什么)
然后是heap2拉下去,修了一整天才上来。
如此来看,第一天打的时候,pwn一共就4道题,结果有一半的题目是坏的,这让我对这个比赛产生了 极其严重的怀疑(我记得还有个pwn,64位程序发了32位ld,感觉出题人不是很上心呢哼哼)
而且还害我错过了阴间的一血,我的R.E.P.O呜呜呜呜
然后第二天我也不太想打,但是队长sama表示你不能不打啊,后面好多人在追呀,然后题目下下来一看
全是栈溢出,没绷住
更不想打了,从漏洞到利用,基本上看一眼就都想出来了(当然,一般来说有思路和有exp距离是很远的,但是这种一眼栈溢出,一眼栈迁移,只是调参数特别麻烦的题目……我是不太喜欢做)
然后xy期间还有另外一场ctf,我就去搞那个了,剩下两题摸了摸了。
本来这就是一场平平无奇的,pwn方向题目质量偏低的小比赛(←眼高手低大暴论),结果后来好像看到了什么不好的风言风语。但是我比较懒,就不管那么多了,呜呜还有好多东西要学,还是摸鱼ba(躺)
girlfriend思路
找女朋友这么麻烦,我不想找了(?)
选项1里面有栈溢出,选项3有非栈上格式化字符串和数组越界。选项3的数组越界可以让选项1和选项3多次调用。然后用fmt和残留参数泄露一下pie和libc,接下来就变成随便打环节了。
嗯,然后出题人再加了个沙箱,再没收了你的libc让你打远程泄露。虽然确实加大了难度,但是说实话……
(真的很没意思!!!)