Menu

Misc


Welcome

丢进stegsolve,选择隐写分析,讲图片分成两份,其中一份右移100像素可以看到flag

QWB{W3lc0me}


Crypto


streamgame1

因为给出了key,而明文空间较小,所以写脚本爆破

flag{1110101100001101011}


streamgame2

flag长了一点但是可以接受,还是爆破

flag{110111100101001101001}


streamgame3

查了资料像是一个魔改的A5算法,single_round中有一个逻辑表达式(x1*x2)^((x2^1)*x3),真值表如下:

x1 x2 x3 v
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

经观察,x1 == x3的时候,v = x1 = x3。R1,R2,R3相互独立,三个mask参数为常数值。又因为有两个assert限制了R1和R3的长度分别为4和5位十六进制位,故先尝试爆破R1和R3。脚本代码如下:

其中优化了一部分lfsr的运算,去掉了R2的部分,又加了多线程还是跑了很久,终于得到了flag的R1和R3部分:flag{01b9cb******16b2f3}

然后爆破中间五位,核心代码如下:

得到flag:

flag{01b9cb05979c16b2f3}


streamgame4

还是直接爆破,这里的key验证前12字节足矣

flag{100100111010101101011}


nextrsa

Level 1


n 很小,可以直接分解

Level 2


n, e 非常大,猜测是低解密指数攻击(d 很小),用 Wiener attack(https://github.com/pablocelayes/rsa-wiener-attack)

Level 3


e = 3, M = m + x, m 和 c 已知,x 为 64bit 内的小整数。

因为已经知道了 M 的高位,所以直接 Coppersmith method 攻击。核心代码:

Level 4


已知 n=p×q,z=nextprime( p)×nextprime(q)

枚举 delta_p, delta_q,则有方程

pq=n

(p+\Delta p)(q+\Delta q)=z

可以化简得一个关于 p(或 q)的一元二次方程

\Delta p\cdot q^2+(n+\Delta p\cdot \Delta q-z)q+\Delta q\cdot n=0

然后验证\Delta=b^2-4ac 能否开根,以及验证两个方程解是否为正整数就行了。根据素数密度\pi(n) \sim  n \ln n ,delta 不会太大,最终解出来也就 1000 多。核心代码:

Level 5


n 含有小因子,直接 yafu 暴力分解

Level 6


m^3 = c + kn。爆破 k 尝试开三次根,最终的 k 大概 70000+。核心代码:

Level 7


n1, n2 含有公因子,所以直接 gcd(n1, n2) 得到公共因子

Level 8


共模攻击,扩展欧几里得解 xe_1+ye_2=1,然后就有c1^xc2^y\equiv m^{xe_1+ye_2} \equiv m,所以有 m = pow(c1, x, n) * pow(c2, y, n) % n,要注意一下 x, y 的正负号,如果为负数,则对对应的 c 取模 n 意义下的逆元。核心代码:

Level 9


e=3,低指数加密,给了三组样本,所以直接中国剩余定理合并同余式子,最后开三次根就行。核心代码:

flag{s1mp13_rs4_f0r_y0u_+_h4pp9_f0r_qwb}


Web


web签到

两个php小技巧和一个md5碰撞

第一个利用0e开头md5值bypass

第二个用数组bypass

第三个去找一个真正的md5碰撞,python写脚本发包即可

脚本代码如下:

运行脚本得到flag:

QWB{s1gns1gns1gnaftermd5}


Share your mind

可以看到有一个 js 文件是相对路径导入的
利用 RPO 构造 XSS
写一个 alert(/xss/)

部分字符会被HTML编码 用 String.fromCharCode 可以绕过
打一下 admin 的 cookie

http://39.107.33.96:20000/index.php/view/article/31568/..%2f..%2f..%2f
直接把链接 Report 过去就有回显
得到一个 HINT=Try to get the cookie of path “/QWB_fl4g/QWB/”

写一个 iframe src 过去读 cookie 就能获得 flag

http://39.107.33.96:20000/index.php/view/article/31663/..%2f..%2f..%2f
Repost 链接过去 就能收到 cookie 即 flag

QWB{flag_is_f43kth4rpo}


Three hit

二次注入/盲注,注入点在 age
注册的时候 age 被 is_numeric 了
可以 hexlify 一下绕过
跑一下脚本即可

QWB{M0b4iDalao0rz0rz}


彩蛋

首先web.xml找到

http://106.75.97.46:8080/phrackCTF/druid/

并附上登录帐号:admin,密码:SgK1xfVxTk

登录进去,发现数据库帐号密码,远程连接

psql –host=106.75.97.46 –username=postgres –no-password

拿到数据库,udf提权,在根目录找到flag

select sys_eval(“cat /flag_is_here”);

拿到flag

QWB{jarv1s0j13p5ettyg006}


Python is the best language 1

注册登录进去,input的框可以注入,理论上可以脚本跑,但是平台卡成狗,就直接手跑了

payload:

1’+ord(substr((select fllllllag from flaaaaaag),1,1))+’1

哪个表哪个列不记得了,flag

QWB{us1ng_val1dator_caut1ous}


PWN


core

开了kaslr,没开smep,但是在/tmp目录下有个诡异的文件,可以泄露内核函数地址,然后copy那里长度为负数会溢出,read函数会leak 模块的canary,所以直接rop就行了。


raisepig

fastbin attack修改topchunk,把它改到 free_hook附近,通过申请内存修改free_hook getshell

qwbctf{ok_now_you_know_how2_raise_a_pig}


silent

fastbin attack修改got表…

qwbctf{talk_is_cheap_show_m3_the_code}


silent2

考虑 fake malloc chunk进行unlink,修改got表

qwbctf{sorry_for_all_the_troubles}


Reverse


picturelock

this.enc(v1_1, this.getFilesDir().getAbsolutePath() + v1_1.substring(v1_1.lastIndexOf(“/”)) + “.lock”, this.j());
第一个参数是图片路径,第二个大概是输出目录,第三个是签名

enc在lib里面

600C储存签名

sub_1A48的第一个参数是图片路径,第二个参数是输出路径

Signature HexData :

f8c49056e4ccf9a1
1e090eaf471f418d
找了一下,似乎是个快速aes

随便写个脚本就行了


simplecheck

程序读入一个字符串,把内存中的一些数据做解密,然后对比
关键代码:
if((a[i]!=b[i]*ans[i]*ans[i]+c[i]*ans[i]+d[i]) or (a[i+1]!=b[i]*ans[i+1]*ans[i+1]+c[i]*ans[i+1]+d[i]))
根据下个循环,可以得出一个一元二次方程组,来保证唯一解

flag{MAth_i&_GOOd_DON7_90V_7hInK?}


hide

dump内存,丢ida f5
调试 catch ptrace
发现真正的验证函数
解题脚本:

qwb{f1Nd_TH3HldeC0dE}