和队友拿了个前几名的好成绩,pwn题量不大也有原题,侥幸AK了。
Slient
开启了沙箱,只能执行open和read。和天翼杯的一个题十分相似,拿我之前的脚本改了一下。爆破的方法是 把flag 的每个字节取出来放到寄存器 al 中,然后与我们的可输出字符返回比较,如果比较一致使用 JZ 跳到 ret 返回,如果不一致 则使用 JZ跳入死循环。
1 | from pwn import * |
fuantoie
题目给了一大堆混淆代码,分析了一下没什么用。然后手工测试,发现执行show时会发生栈错误。经过分析,是如下函数可以发生栈溢出,snprintf函数的返回值是源字符串的大小,而不是目的字符串,所以返回值为0x200,后面通过scanf读,就可以溢出。
1 | unsigned __int64 vul_input() |
栈溢出时,还有个小技巧就是如何绕过canary。scanf(‘%d’,c),如果输入 +/- 并不会修改c的值。也就是当要覆盖canary时,我们输入+/-来跳过覆盖canary,然后ROP泄露地址,再去执行system(‘/bin/sh’)。
1 | from pwn import * |
Simple_canary
这道题又个明显的栈溢出。在栈上找到一个libc
上的地址(__libc_start_main+231
)然后通过栈溢出和滑板指令,滑板指令这里也算是一个不常见的技巧,利用0xffffffffff600000
,可参考我之前所写的安恒8月赛题解。覆盖这个地址的后三个字节使之成为一个one_gadget
,这里找的gadget是0x45226,由于后12bit是固定因此只需要爆破低12bit之前的12bit就行了。
1 | from pwn import * |
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/12/19/2020蓝帽杯-final/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!