强网拟态WP
总的来说这次强网拟态的PWN题都不算难,不过有几个点倒是挺有意思的。
一、sonic
泄露elf_base了,然后直接栈溢出,利用本身自带的gadget即可getshell。但是这里也有一个后门函数,之后才发现的,不知道为啥。/usr/bin/cli
这个命令居然直接得到flag。
1 | # -*- coding:UTF-8 -*- |
这里可以注意下execv这个函数,设置了rdi为/bin/sh
之后还需要设置rsi为0才可getshell。
二、bitflip
这也是很常规,2.27的off by one,只能最大0x60的Chunk,可以直接改size大于0x80的fastbin,填满tcache之后释放进入Unsortedbin泄露地址,之后就常规改free_hook了。
1 | # -*- coding:UTF-8 -*- |
三、old_school
很常规,2.27的off by one,直接拿off by null的模板改了,其实用上面bitflip的模板也是一样的,改size。
1 | # -*- coding:UTF-8 -*- |
四、old_school_revenge
刚好又出了个off by null,同样就是模板打
1 | # -*- coding:UTF-8 -*- |
五、pwnpwn
泄露canary后直接ret2plt即可
1 | # -*- coding:UTF-8 -*- |
六、random_heap
这道题目比较有意思,虽然是最简单的UAF,但是不知道为什么每次都会随机更换bin中chunk的位置,但是对应的索引chunk其实还是不变的,所以直接爆破就好。但是这个也可以通过填满0x100以下大小的tcache来更大概率getshell。
1 | # -*- coding:UTF-8 -*- |
七、bornote
这道题目贼傻逼,最开始依据urandom申请了一个随机大小chunk,导致堆布局会失效。但是由于题目设置,实际上也就存在大概十来种大小的chunk,选一个实例爆破一下即可。但是最开始我居然还以为这个是很随机的,直接假设申请了240大小的Chunk,结果爆了一晚上都没爆出来,实在是傻逼了。之后就是正常的2.31下的off by null了。
1 | # -*- coding:UTF-8 -*- |
八、oldecho
这道题目最有意思了,close(1),然后循环的格式化字符串。需要改stdout的fileno为2才能恢复输出。同时由于close(1),导致格式化输出printf的大小不能太大,大概0x2000左右就不行了,所以也需要爆破一下。之后又由于栈环境问题,这里给了栈地址,但也是需要爆破一下最后的一些大小问题,大概设置在一定范围可控。
此外由于栈上没有stdout,所以需要抬栈,比赛的时候没做过改fileno的,是学长做的。赛后照着自己的思路复现了一下,先覆盖返回地址返回到上一层函数,即main函数中,之后再返回到start,之后就使得可以在栈上留下IO_2_1_stout。(这里具体为什么会出现我也不太懂)
然后就是改返回地址,pop rbp将输入的bss段给rbp,然后借助leave ret指令将rbp给到rsp,劫持栈到输入的bss段上,之后就是正常的ORW。
这里借助栈寻找gadget也是一个小难点。
1 | from pwn import * |
总的来说这次pwn着实有点水,和强网杯一比差好远啊。