2019NISC CTF 部分 WriteUp
2019-08-21 18:22:38 Author: www.cnpanda.net(查看原文) 阅读量:370 收藏

操作内容:
查看源码发现存在可疑 JS 文件:

1.png

读取发现:

image

构造 POST 请求,参数 score=15 时,即可读出数据

3.png

观察源文件:

4.png

猜测存在XML 注入,经过测试发现的确存在 XML实体注入

5.png

因无法确定 flag 的路径,无法使用 file 直接读取,使用php://filter/read=convert.base64-encode/resource=的方法来读取 index.php的文件:

6.png

解密后:

7.png

域名解析查询发现

8.png

文件头伪装成了PNG,其实是GIF

9.png

共计66帧动画,百度搜索七代目相关gif,可以找到原文件,为65帧。对比发现第七帧是重复的

10.png

使用stegsolve即可得到答案。

11.png

12.png

破解出密码 loli,解压后得到图片文件,
使用winhex打开图片发现存在可疑的数据:

13.png

提取出来后:

14.png

brainfuck解密:

15.jpeg

16.png

17.png

根据最初的图片的提示,使用社会主义核心价值观解密:

18.jpeg

得到图片:

19.jpeg

扫描可得正确答案:

20.png

已知N、dq,求分解问题,利用脚本如下:

import gmpy2
import libnum
e=65537
n=9637571466652899741848142654451413405801976834328667418509217149503238513830870985353918314633160277580591819016181785300521866901536670666234046521697590230079161867282389124998093526637796571100147052430445089605759722456767679930869250538932528092292071024877213105462554819256136145385237821098127348787416199401770954567019811050508888349297579329222552491826770225583983899834347983888473219771888063393354348613119521862989609112706536794212028369088219375364362615622092005578099889045473175051574207130932430162265994221914833343534531743589037146933738549770365029230545884239551015472122598634133661853901
dp=81339405704902517676022188908547543689627829453799865550091494842725439570571310071337729038516525539158092247771184675844795891671744082925462138427070614848951224652874430072917346702280925974595608822751382808802457160317381440319175601623719969138918927272712366710634393379149593082774688540571485214097
c=5971372776574706905158546698157178098706187597204981662036310534369575915776950962893790809274833462545672702278129839887482283641996814437707885716134279091994238891294614019371247451378504745748882207694219990495603397913371579808848136183106703158532870472345648247817132700604598385677497138485776569096958910782582696229046024695529762572289705021673895852985396416704278321332667281973074372362761992335826576550161390158761314769544548809326036026461123102509831887999493584436939086255411387879202594399181211724444617225689922628790388129032022982596393215038044861544602046137258904612792518629229736324827
for i in range(1,65538):
    if (dp*e-1)%i == 0:
        if n%(((dp*e-1)/i)+1)==0:
            p=((dp*e-1)/i)+1
            q=n/(((dp*e-1)/i)+1)
            phi = (p-1)*(q-1)
            d = gmpy2.invert(e,phi)%phi
            print libnum.n2s(pow(c,d,n))

题目虽然进行了控制流平坦化,但验证逻辑过于简单,脚本如下:

data="J2261C63-3I2I-EGE4-IBCC-IE41A5I5F4HB"
flag='flag{'
for i in data:
if i=='-':
flag += '-'
elif i >= '0'and i <= '9':
flag += chr(ord(i) + 48)
elif i>='A':
flag += chr(ord(i) - 17)
flag+='}'
print flag

func1:

21.png

分析_func·1,转换为标准函数方便自动化计算,根据IfElse块拆成标准的if else,然后再根据func1把相应的代码转换为使用while的条件循环处理。

22.png

func2:
func2较为简单,比较轻松把递归拆成while解决

image

func3:
func3就更加简单了,轻松转换为标准函数

24.png

Func4:

25.png

Func4有些复杂,得先转换NEXTN和NEXTM。
然后再转换TEST函数,TEST函数有两个固定的返回值,这里需要注意。
然后再把func4的两个固定条件返回值协商,并且引用TEST函数即可完成。

26.png

主函数:
根据output提示,定义max数组
当func3(func2(j))等于1时,符合题目的条件,因此写了这个双循环,用来直接自动化生成x1到x5的5个符合条件的数字。

27.png

根据题目给的提示,循环计算func4等于1有多少个数字,然后总数就是x6了,于是写了下面的代码来计算。

28.png

最后就能得到flag了。

29.png

标准的sm4加密,直接使用c语言版本运行即可得到flag

30.png


文章来源: https://www.cnpanda.net/ctf/346.html
如有侵权请联系:admin#unsafe.sh