corctf2022-wp
把各个方向的简单题给摸完了。
当然这样是不行的。
tadpole
题面:
1 | from Crypto.Util.number import bytes_to_long, isPrime |
下减上得:
左右相减是p的倍数,分解质因数即可(其实就是质数)。
luckyguess
1 | #!/usr/local/bin/python |
使用不动点,构造
故
gmpy2.invert
即可。
exchanged
1 | from Crypto.Util.number import * |
(以下相等默认在模
将mult
展开得:
推一下式子可得:
将B错位相减得:
故可求得
注意aes CBC模式的key与iv都是大端序。
1 | from Crypto.Util.number import * |
Microsoft ❤️ Linux
前半部分直接ida加载32位elf格式,将指定范围的bytes
ror 13
即可。(其实就是ror 5
)
后半部分ida用二进制模式打开,选择16位,可以发现是dos指令,加密方式是xor 13
,长度为18,然而加密范围好像有点问题。
密文只可能存在于0x210~0x233之间,整个异或13之后发现后18位像flag,与前面拼接即可。
whack-a-frog
拿到一个pcap文件,查看发现有很多get请求。
先提取这些get请求:
1 | cat whacking-the-froggers.pcap| grep -a 'anticheat?x=' > in |
其中都含有x坐标和y坐标。使用正则表达式提取:
1 | from pwn import * |
然后用c语言转换成字符画,结果之前把x和y搞反了:
1 |
|
gedit缩小查看,发现笔画大致是对的,那应该就是flag了。
jsonquiz
最后提交分数的时候抓包把score=0
改为score=100
即可。
babypwn
1 | $ one_gadget /usr/lib/x86_64-linux-gnu/libc.so.6 |
内平栈,格式化字符串泄露libc。由于r12和r15都在栈上,最后把缓冲区换成全0的内存地址,one_gadget
一把即可。
1 | def exploit(): |
cshell2(赛后补的)
libc 2.36的heap overflow+tcache poisoning,由于libc 2.36跟2.35的安全机制没啥区别,就用本地的2.35做了。
io是真的硬伤。
1 | # all io.sendline() or the stream will stuck |