Lilctf PWN方向全全全全题解!
I like C++


114514后门选项,里面会设置一个函数指针,其中偏移3的地方为后门函数
里面有一个scanf(“%s”),裸的栈溢出,还有格式化字符串

条件是拿到堆地址,只要我们输入的地址和它的堆地址一样就能触发
exchange里有个浅拷贝,会free对象并导致leak
最终exp
1 | from pwn import * |
ret2all
栈溢出,但是要求前0x60个字符是i love you,且当前函数的rbp的返回地址不能更改
虽然不能更改当前函数的,但是能改下一个函数的
但是只能改到rbp
中间有0x10的字节
做栈溢出,缩短栈帧,确保 rbp - 0x60 > rsp
这样读入的时候就会直接修改read的返回地址,从而扩大溢出范围到0x88
在后来的栈迁移中我们必须始终保持这个条件成立
用sub rsp 0x60 … 和pop rbp; ret;来控制栈,在高地址我们会找到一个残留的free
这个高地址free附近有一个pop rbx,设置rbx以后用magic gadget把这个地址修改为syscall; ret;
然后构造两次SROP,分别打出 dup 1 和 write 2 泄露 libc 地址
之后简单的ROP即可
1 | from pwn import * |
trumanshow
这道题是侧信道,通过控制程序错误码来爆破flag
给的shellcode太短,把要设置的字符串flag和其它值read到栈上然后pop可以减少长度
虽然chroot了根目录,但是openat没有禁用,可以用openat的相对目录功能来打开flag
(fd = 2 -> “/“,然后rdi = 2, rsi = flag, rdx = 0, r10 = 0 即可)
最后就是爆破,因为过滤了那几个字符,我们不能用add和cmp
但是我们可以用sub和jb、ja、je来做同样的事情
注意flag字符包括过滤的那几个字符,所以可能要多次修改shellcode确保最终flag正确。
1 | #!/bin/python3 |
kuroko
不说了先上exp!
1 | import kuroko |
好吧我并不知道怎么转float和int64,所以让ai用纯数学方法写了一版
(最后快做不完了于是便找出题人要了转化函数)
(尽管最后还是没在时间内做出来wuwu)
漏洞在tupleiterator()里面,直接传数字x进去,就会把数字x所在地址当作对象并构造迭代器

可以看到成功crush。然后考虑配合id泄露出来的栈地址来伪造对象。
动调+ida可以看到,元组对象和列表对象大概是这样的
1 | struct KrkInstance // sizeof=0x40 |
因为id可以泄露对象的地址,而对象里的指针和标记值我们往往是无法控制的
但我们可以控制对象指针指向的内容(比如说,list里的内容)
我们期望找到一种对象,他的内容紧邻对象本身分配。
(没有调试过局部变量情况的,后面可以补一下)
(如果有想复现这题的师傅,简易所有变量用函数包起来变成局部变量)
(全部全局变量的话会有奇怪的问题,调试感觉是编译器会一次性读取全部全局变量)
(然后再进行优化与分配,这样会导致一个问题)
(就是可能你后面写代码新建对象会影响到先前变量的分配。。。)
最后调试发现两种对象可以,分别是bytes字符数组和str字符串(均有大小限制)
最后为了方便选取字符数组,用to_bytes可以方便地转化
然后我们伪造如下对象
1 | 00 0008 // flags tuple |
伪造完毕后可以用next读取id对象附近内存
但是tuple目前只能读,我们还期望构造出任意写,这样才可以进行攻击
任意写的话就要构造list,但是实测由于list对象太大,没办法紧贴对象直接伪造出来
所以用我们刚刚获得的任意读来直接拿到一片我们可控的内存
1 | let b = bytesarray(0x1000) |
于是我们拿到了一大片可读可写的空间,我们将在这里继续进行我们的攻击
构造
1 | 00 6 // type=instance |
这样猛猛构造一通以后,我们再用刚才的漏洞拿到fake_iter2
此时你就会惊喜地发现,怎么还是返回double
(那哪里来任意写呢?iter又不支持我们写)
正常情况下,iter只会返回元组或列表里的内容,既然你的指针指向一个无标识的double,那当然就是返回double咯
但让我们换个思路,如果是一个元组套列表,iter会返回什么?
会返回一个完全由我们伪造的列表!
然后如果我们让这个列表的长度超级大,我们就能实现任意读写。
最后我们用这个任意读写打rop执行/readflag即可
(试了system,因为神秘的原因运行不了,好奇怪)
heap-pivoting
什么打歪了
unsorted bin attack 打堆列表,拿到直接编辑main arena
然后编辑arena,topchunk改到堆列表上
alloc完直接拿任意写然后秒了
(topchunk改歪了导致top chunk size=0 崩溃了)
(居然因为这个原因没做出来吗。。。哈基呆你真是。。。)
(我以为有页对齐检查于是睡觉了)
(???)

