2019第十二届全国大学生信息安全实践创新赛Writeup

本文章来自https://www.cnblogs.com/iAmSoScArEd/p/10780242.html  未经允许不得转载!

1.MISC-签到

下载附件后,看到readme.txt打开后提示会有摄像头,一开始丢winhex,ida里啥也没发现,于是就选择直接打开qiandao.exe,当自己出现在镜头里时,会有个绿框,等了很久什么也没发现,于是回到题目是发现三人行必有flag,百度了一下这个软件的xml文件的文件名,发现是人脸识别,结合想到,于是找了个三人照片,发现flag。

 

2.Crypto-puzzles

下载附件是一个html,打开后发现flag格式和题目。

a 1、2、3、4直接计算器计算:

 

得到a1=4006,a2=3053,a3=2503,a4=2560

Part1看了半天,常规找规律等差等比都不是,用二进制将三个已知的表示出来也没发现东西,去查询数字性质

 

扫描二维码关注公众号,回复: 6037772 查看本文章

因为前两个有一个未知,直接查后两个,发现都是质数,应该不会那么巧,应该是质数的等差数列,且相差37,于是前推37个质数,得到26365399,然后利用第一个质数查询

发现刚好4个数都是相差37个。

Part2

 

可以看到有四部分组成,分别求解:

 

4*lim(x->2) (x^2-3x+2)/(x^2-4)

=4*lim(x->2) (x-1)(x-2)/[(x-2)(x+2)]

=4*lim(x->2) (x-1)/(x+2)

=1

 

3*∫(0->ln2) e^x.(4+e^x)^2 dx

=3*∫(0->ln2) (4+e^x)^2 d(4+e^x)

=3*(1/3)[(4+e^x)^3]|(0->ln2)

=3*(1/3)( 6^3 - 5^3)

=91

 

2*∫(1->e) (1+5lnx)/x dx

=2*∫(1->e) (1/x) dx +5∫(1->e) (lnx/x) dx

=2*[lnx]|(1->e)+5∫(1->e)*lnx dlnx

=(1 +(5/2)[(lnx)^2]|(1->e))*2

=7

 

∫(0->π/2) xsinx dx

=-∫(0->π/2) xdcosx

=-[xcosx]|(0->π/2) +∫(0->π/2) cosx dx

=0 +[sinx]|(0->π/2)

=1

求解出来后相加*77,(91+1+7+1)*77=7700,就是part2

Part3

题目如下:

 

       看到题目,网上找到相关公式如下:

 

代入

代入数值解方程 得到Part3为18640

Part4

504*2π/3=p*π/120

120*504*2π=3pπ

P=40*504*2

Part4=40320

最后合并

 

3.Web-JustSoso

下发后第一时间打开F12审查元素

 

发现提示,然后访问file=index.php 访问hint.php都无法显示内容,然后想到了PHP协议

index.php?file=php://filter/read=convert.base64-encode/resource=./index.php

发现成功读取了源码的base64,

然后接着读hint.php的并分别进行解密,得到index.php

Hint.php

 

看见Class就知道应该是考察反序列话,发现无法直接new Flag使用,还得把他加到handle中去执行,于是开始构造如下序列,

 

然后审查index.php发现有个payload会被反序列,而且必须file=hint.php才行直接放到payload一起提交

 

但是提交上面生成的序列化会被拦截,页面显示stop hacking,被正则检测到了。

后来根据匹配中使用的$_SERVER[‘REQUEST_URI’],通过网上查找相关资料,才知道这个的返回值,但是还是不知道如何绕过,根据这个语句在网上找到某大佬博客写到,可以使用///来进行绕过,于是成功,但是没有返回flag。

这时候发现有个随机数的问题

但是没有想到办法绕过,之前没有遇到过,接着搜索相关,知道可以使用序列化引用,让这两个值相等。

 

于是构造

 

返回如下序列化去提交

 

依旧没有返回flag。。。这时候有些泄气,后来在查php反序列话的时候,突然看到代码中的wakeup,之前一直没注意,但是在那篇文章讲了当序列化字符串中,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup的执行。于是把上图中的payload的handle改成了2,为什么构造的字符串为“%00Handle%00handle”呢?在那个大佬博客中看到序列化时生成的序列化字符串中类名前后本来就会有0×00,url编码下为%00,所以要添加。使用///可以绕过uri的过滤,于是构造

///index.php?file=hint.php&payload=O:6:"Handle":2:{s:14:"%00Handle%00handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";N;s:10:"token_flag";R:4;}}

然后使用上面的payload得到

 

1.saleae

首先看到题目名saleae,搜索得知是一个逻辑分析工具,下载安装并学习如何使用。然后下载logicdata文件,用saleae打开,发现有4个频道。

根据题目提示,搜索AoiSystem,发现这个网页标题中提到SPI。SPI协议正好使用了芯片上的4个引脚,猜测logicdata文件应该用SPI协议进行分析。

观察波形,发现channel0是具有周期性的方波,应为时钟信号。

 

channel1没有信号,应为主机输入线。

channel2的波形不具有规律性,应为承载主机输出数据的MISO线。

 

channel3在channel0和channel2有信号时是低电平,其余时间为高电平,应为使能信号。

 

使用saleae进行SPI分析。

 

分析数据处出现flag。

 

导出数据并用文本编辑器处理,得到flag。

2.24c

依题意,本题同样使用saleae进行分析。搜索题名24c得知是基于IIC协议的EEPROM。

 

使用saleae进行I2C分析。

 

得到flag。

 

导出,得到以下文本:

Time [s],Packet ID,Address,Data,Read/Write,ACK/NAK

0.843872000000000,0,'160' (0xA0),' ' (0x20),Write,ACK

0.844038500000000,0,'160' (0xA0),f (0x66),Write,ACK

0.844205000000000,0,'160' (0xA0),1 (0x31),Write,ACK

0.844371000000000,0,'160' (0xA0),6 (0x36),Write,ACK

0.844537500000000,0,'160' (0xA0),3 (0x33),Write,ACK

0.844704000000000,0,'160' (0xA0),b (0x62),Write,ACK

0.844870500000000,0,'160' (0xA0),d (0x64),Write,ACK

0.845036500000000,0,'160' (0xA0),f (0x66),Write,ACK

0.845203000000000,0,'160' (0xA0),4 (0x34),Write,ACK

0.845369500000000,0,'160' (0xA0),e (0x65),Write,ACK

0.845536000000000,0,'160' (0xA0),} (0x7D),Write,ACK

0.845702500000000,0,'160' (0xA0),'0' (0x00),Write,ACK

0.945962500000000,1,'160' (0xA0),'0' (0x00),Write,ACK

0.946318000000000,2,'160' (0xA0),f (0x66),Read,ACK

0.946481500000000,2,'160' (0xA0),l (0x6C),Read,ACK

0.946645000000000,2,'160' (0xA0),a (0x61),Read,ACK

0.946808500000000,2,'160' (0xA0),g (0x67),Read,ACK

0.946972000000000,2,'160' (0xA0),{ (0x7B),Read,ACK

0.947135500000000,2,'160' (0xA0),c (0x63),Read,ACK

0.947299500000000,2,'160' (0xA0),4 (0x34),Read,ACK

0.947463000000000,2,'160' (0xA0),6 (0x36),Read,ACK

0.947626500000000,2,'160' (0xA0),d (0x64),Read,ACK

0.947790000000000,2,'160' (0xA0),9 (0x39),Read,ACK

0.947953500000000,2,'160' (0xA0),e (0x65),Read,ACK

0.948117500000000,2,'160' (0xA0),1 (0x31),Read,ACK

0.948281000000000,2,'160' (0xA0),0 (0x30),Read,ACK

0.948444500000000,2,'160' (0xA0),- (0x2D),Read,ACK

0.948608000000000,2,'160' (0xA0),e (0x65),Read,ACK

0.948771500000000,2,'160' (0xA0),9 (0x39),Read,ACK

0.948935500000000,2,'160' (0xA0),b (0x62),Read,ACK

0.949099000000000,2,'160' (0xA0),5 (0x35),Read,ACK

0.949262500000000,2,'160' (0xA0),- (0x2D),Read,ACK

0.949426000000000,2,'160' (0xA0),4 (0x34),Read,ACK

0.949589500000000,2,'160' (0xA0),d (0x64),Read,ACK

0.949753000000000,2,'160' (0xA0),9 (0x39),Read,ACK

0.949917000000000,2,'160' (0xA0),0 (0x30),Read,ACK

0.950080500000000,2,'160' (0xA0),- (0x2D),Read,ACK

0.950244000000000,2,'160' (0xA0),a (0x61),Read,ACK

0.950407500000000,2,'160' (0xA0),8 (0x38),Read,ACK

0.950571000000000,2,'160' (0xA0),8 (0x38),Read,ACK

0.950734500000000,2,'160' (0xA0),3 (0x33),Read,ACK

0.950898000000000,2,'160' (0xA0),- (0x2D),Read,ACK

0.951061500000000,2,'160' (0xA0),4 (0x34),Read,ACK

0.951225000000000,2,'160' (0xA0),1 (0x31),Read,ACK

0.951388500000000,2,'160' (0xA0),c (0x63),Read,NAK

5.946647000000000,3,'160' (0xA0),\t (0x09),Write,ACK

5.946813500000000,3,'160' (0xA0),a (0x61),Write,ACK

5.946980000000000,3,'160' (0xA0),c (0x63),Write,ACK

分析可知,通过I2C总线执行了三轮操作:

写' 'f163bdf4e}

读flag{c46d9e10-e9b5-4d90-a883-41c

写\t ac

根据I2C操作的相关知识,读操作读到的内容应为芯片上第160页处原本已有的内容,而写入操作则是在第160页处若干偏移量的位置覆盖写入。第一次写的偏移量显示字符为空格,转为十进制ASCII码即为32,注意到读部分读取到c后为NAK且这部分正好有32个字符,因此第一次写是正好接在读到这部分的后面。于是得到flag{c46d9e10-e9b5-4d90-a883-41cf163bdf4e}。再看第三次写,制表符对应的十进制ASCII码为9,即在字符串下标9处用ac覆盖,得到flag。

3.usbasp

根据题意,这题应该和第一天的《saleae》一样使用saleae软件进行分析,且仍然为AoiSystem设备,仍应用SPI协议分析。

打开logicdata文件后首先观察波形,显然channel3应为使能信号。

 

注意到题干中有“一键暴打出题人”,猜测MOSI、MISO、时钟、使能4条线可能直接按0、1、2、3顺序即可,按默认设置很符合“一键”的说法。

 

直接按默认设置运行,未能得到结果。

 

再读题目,又注意到“升级固件”,猜测协议设置要修改。翻出第一天的saleae.logicdata进行对比,使能信号最可疑。

 

改它丫的!

 

运行看到flag。

 

导出,得到flag。

1.easyGo:

此题拿到手,拖进ida发现是内联编译的,函数名称都没了,遂从程序找入口,运行程序

出现字符串Try again,在ida中搜索,根据交叉引用来到如下图处,大概可以看出输入和输出的地方

 

尝试点了函数附近的变量,,,,flag竟然以明文在内存中存放,用脚本提取即得到flag

 

2.Bbvvmm:

比赛一开始就看这道题,杠了整整一天,经验少,走了很多弯路,下面讲思路:

拖入ida,动态调试各个流程跟进弄清函数作用,刚开始没注意提示,盲目的在加密函数里花了大量时间,当看到提示后,立即搜索国密加密算法,找到SM4算法,下载源码,发现和题目的流程一模一样,那就好办了,下图为分析出来的一些函数:

可以看到这个函数把username的ascii拆开再用ascii保存

 

加密的结果经过base64编码,

 

解开base64:EF468DBAF985B2509C9E200CF3525AB6

用网上代码解密(密钥就在题目主函数里),然后合成ascii:

 

得到:6 2 6 1 6 4 7 2 6 5 7 2 3 1 3 2

即badrer12

我以为这就完了,想着password随便输

噩梦才刚刚开始:

另一个条件根据题目名看出和vm相关,对这一块了解不多,只能慢慢分析,分析出刚开是初始化函数的结构,

 

分析函数跳转过程,尝试分析op对应函数的用途,然后就在挣扎中分析了一下午,难度太大,很绝望。

然后就放弃分析流程,开始打算找规律,将ida栈视图调整为虚拟指令的sp(很容易找),把断点下在call上,初始输入的password为123456

随着程序运行,在栈视图可以跟踪到这几个数的ascii,发现

 

31->49,32->4B,33->49,34->4F,35->49,36->4B,判断点的值则是对应值相加的结果

规律并不明显,尝试把输入和对应的数字异或,发现其在栈上出现了,而且每个都出现了;

31xor49 = 78, 32xor4B = 79,即找到的对应的数字是有78和31异或得到的,其余同理,为了让判断点的值为0,可输入78,79等,这样和栈中的数异或依然为0,即78,79等代表的字符就为正确密码。即xyz{|}

 

所有信息都在栈中,可以很容易看出规律

拿到密码本地测试成功,但nc却不行,排除题目原因,只能是疏忽了什么,看了下代码,username是用scanf以%9s读入的,而输入username只有8个字符,估计是第9个字符没读上,遂用pwntools连接,在username后添\x00,成功得到flag

 

 本文章来自https://www.cnblogs.com/iAmSoScArEd/p/10780242.html  未经允许不得转载!

猜你喜欢

转载自www.cnblogs.com/iAmSoScArEd/p/10780242.html