参加了*ctf的个人认证,太懒了一直没写blog,这里记录当时答的题顺便复现正赛题目。
Grey(misc)
签到题,flag第一部分用stegsolve在Alpha plane3通道看到,第二部分则是在图片的hex数据段最后,第三部分则需要把图片改高一点(crc爆破宽高)再用stegsolve查看。
连起来就是*CTF{Catch_m3_1F_y0u_cAn}
oh-my-grafana(web)
百度搜索 grafana cve 找到Grafana8.x 任意文件读取;github上面找到一个poc:https://github.com/rnsss/CVE-2021-43798-poc 脚本克隆到本地。
尝试直接打,发现没能成功,貌似是因为文件内容太大poc接受不了那么多数据。于是直接用bp发包来打,在grafana.ini中有用户名和密码。登入之后发现Explore可以执行sql语句,先查询得到表名:
1 | select 11,group_concat(table_name)from information_schema.tables |
最后查表得到flag。
babyRSA(crypto)
比赛的时候找到一道类似的题目。但发现不太一样,那题数据特殊,p和q刚好bit-inverse,可以列方程解,这题并不能用相同的方法。
how to do it? 观察会发现,即使p和q之间没有比特相反那么强的关系,异或的关系也不弱(因为我们知道message)。那么可以通过遍历p和q每一位的值,通过异或关系排除一些情况,得到真实的p和q:
1.当p第i位取1的时候,q对应位一定为m_i^1
2.当p第i位取0的时候,q对应位一定为m_i
3.每一轮取值以后都进行现有低位的乘法并把积与n的对应低位比较,若相等,则符合
4.1024轮以后得到p,q的真实值
5.这样的算法大大减少了遍历的可能性,时间复杂度可以接受
1 | #!/usr/bin/python |
ezRSA(crypto)
思路:对N开方得到p的高位,异或关系得到p中间几位,coppersmith得到p的低位。
q的比特如图所示:
所以对n开方是可以获得p和q的最高124位。
爆破中间位数之前先将p的低900位全设置为1,q的低900位全设置为0,因为p和q的中间bit是相反的。
这里类似于均值不等式,p和q差距越大,乘积越小,所以初始的时候是最小的。所以从高位开始,每次把p的某一位变为0,q的对应位变为1,p和q的乘积是在变大,只要还小于n,就该继续异或赋值变换。而由于现在的低300位p全为1q全为0,不是准确值,经过爆破以后p和q中间部分比特的尾端部分(大概450-300位这一段,具体是多少可以在p高位攻击的时候多次尝试)也是不准确的,因此在最后进行p高位攻击的时候,x比特应该取450左右。 p和q中间有一部分比特值固定不受低300位影响,因为低300位最多只能影响到n的300+1024位,n的某一部分高位和pq的低300位无关。这部分由p和q的高位决定,所以是固定值。
最后p已知高位攻击解rsa即可。
1 | from Crypto.Util.number import * |