2019年领航杯 江苏省网络信息安全竞赛 初赛部分writeup
赛题已上传,下载连接:https://github.com/raddyfiy/2019linghangcup
做出了全部的misc和前三道逆向题,排名第10,暂且贴一下writeup。
关卡一 编码解码
base64解码即可。flag:
WelcometothepilotCup
关卡二 取证分析
注意到DNS查询名QNAME前面有一串16进制的串,先写脚本查看一下字符串:
from scapy.all import * r = rdpcap("pacp.pcap") a = "" b = "" for i in range(,len(r)): a = r[i][DNSQR].qname b = a.replace(".skullseclabs.org.","") print (b.replace(".","")).decode("hex")
得到了
看来方向是正确的,并提示我此流量是使用dnscat2生成的。
在输出中,还可以找到 IEND。因此存在被传输的PNG文件。
把部分字节dump下来,发现与图像相关的字节在跳过9个字节之后开始。于是写脚本生成图片文件:
#!python2 from scapy.all import * r = rdpcap("pacp.pcap") a = "" b = "" c = "" new = "" f = open("filedump","w") for i in range (,len(r)): if r[i].haslayer(DNSQR) and not r[i].haslayer(DNSRR): a = r[i][DNSQR].qname b = a.replace(".skullseclabs.org.","") b = b.replace(".","").decode("hex")[:] if b == c: continue c = b if < i <: new = new + b f.write(new) f.close()
用winhex打开,发现确实如此。
把首尾的垃圾数据删掉就能打开此图片了
FLAG:b91011fc
关卡三 steganoⅠ
查看16进制,发现flag
steganoI
关卡四 stegano
用binwalk扫一下,发现图片后面还包含了其他文件,提取后得到一个solution.txt,打开就是flag。
EORDFFOMFPMA
关卡五 LSB
其实这道题不是LSB隐写,是吧flag写到了一个通道里,用stegsolve可以看到。
ONPGRAMBCICM
关卡六 恢复与解密
用取证大师直接把删除的内容回复,可以看到很多文本。
有价值的是这个
在网上搜这个字符串,会指向https://blog.csdn.net/weixin_42213572/article/details/80322393
,应该是其他比赛的题。
脚本:
#!python2 import string from base64 import * b=b64decode("aWdxNDs3NDFSOzFpa1I1MWliT08waWdx") data=list(b) for k in range(,): key="" for i in range(len(data)): key+=chr(ord(data[i])^k) print key+"\n"
挑一个最有可能的提交就是了。不要纠结为什么这么做,一道没水平的脑洞题而已。
jdr78472Q82jhQ62jaLL3jdr
关卡七 文件提取
用记事本打开文件,发现是data:image/jpeg开头的一个base64格式的图片,还原图片后把图片用winhex打开,在末尾发现flag
flag{068EEF6A7BAD3FDF}
关卡八 凯撒Ⅰ
基本的凯撒密码,用工具枚举出所有可能,挑一个最有意义的。
MOCONLFPEOLD
关卡九 凯撒Ⅱ
改成了ascii码下的凯撒密码,所以需要写个脚本枚举。
#include<stdio.h> #include<string.h> #include<windows.h> int main(){ int i,j; char str[]="\x0B\x33\x33\x28\x20\x2E\x33\x26\x70\x20\x3D\x33\x39\x20\x37\x33\x30\x3A\x29\x28\x20\x33\x32\x29\x20\x31\x33\x36\x29\x20\x27\x2C\x25\x30\x30\x29\x32\x2B\x29\x20\x2D\x32\x20\x3D\x33\x39\x36\x20\x2E\x33\x39\x36\x32\x29\x3D\x72\x20\x18\x2C\x2D\x37\x20\x33\x32\x29\x20\x3B\x25\x37\x20\x2A\x25\x2D\x36\x30\x3D\x20\x29\x25\x37\x3D\x20\x38\x33\x20\x27\x36\x25\x27\x2F\x72\x20\x1B\x25\x37\x32\x6B\x38\x20\x2D\x38\x03\x20\x75\x76\x7C\x20\x2F\x29\x3D\x37\x20\x2D\x37\x20\x25\x20\x35\x39\x2D\x38\x29\x20\x37\x31\x25\x30\x30\x20\x2F\x29\x3D\x37\x34\x25\x27\x29\x70\x20\x37\x33\x20\x2D\x38\x20\x37\x2C\x33\x39\x30\x28\x32\x6B\x38\x20\x2C\x25\x3A\x29\x20\x38\x25\x2F\x29\x32\x20\x3D\x33\x39\x20\x38\x33\x33\x20\x30\x33\x32\x2B\x20\x38\x33\x20\x28\x29\x27\x36\x3D\x34\x38\x20\x38\x2C\x2D\x37\x20\x31\x29\x37\x37\x25\x2B\x29\x72\x20\x1B\x29\x30\x30\x20\x28\x33\x32\x29\x70\x20\x3D\x33\x39\x36\x20\x37\x33\x30\x39\x38\x2D\x33\x32\x20\x2D\x37\x20\x31\x25\x37\x37\x32\x34\x2A\x33\x25\x37\x26\x37\x72"; for(i=;i<;i++){ for(j=;j<strlen(str);j++){ putchar((str[j]+i)%); } putchar(); } system("pause"); return ; }
答案:
Massnpfoasbs
关卡十 ascii
对照编码表,把ascii还原出来即可。
Ihbdsieopdcn
关卡十一 forensics
用foremost提取docx文件里的所有文件,第二张图即是flag
关卡十三 OldCypher-Easy
维吉利亚加密
在这个网站破解https://www.guballa.de/vigenere-solver
flag{d06f849b8bb85a5821aa7d9aa5169a38d620016f}
关卡十四 MasterofZip-Middle
level1:因为是纯数字,所以先暴力破解,得到密码19950453796
解压后出来Readme.txt和level2.zip,发现level2.zip里也有一个Readme.txt,把已知的Readme.txt压缩后发现与level2里的文件crc相同:
此时符合zip明文攻击的条件,用AZPR攻击后得到一个无密码的文件,解压得level3.zip。
经过不断测试,level3是一个伪加密,用ZipCenOp工具可以还原正常,解压得到图片flag.png,检查后发现crc校验不对,推测是高度隐写,把高度手动修改即可看到完整图片
flag{4537ec3bd52ba2b41c4a780db841efc3ddccc4a4}
关卡十五 数据包分析-Easy
用strings直接可以看到flag
flag{3eyufhnj87}
关卡十六easyelf
可以直接用angr分析,脚本:
import angr import claripy p= angr.Project('./easyelf',auto_load_libs=False) state=p.factory.entry_state() simgr=p.factory.simgr(state) simgr.explore(find=lambda s: b"right." in s.posix.dumps()) print(simgr.found[].posix.dumps())
flag{Thunk_c0des_xoR_thr3e_de4l}
EasyRSA
phint和qhint就是常见文章里的dp和dq,他俩加上c、e、n全部已知的话是可以实现任意密文解密。
参考文章:
https://skysec.top/2018/08/24/RSA%E4%B9%8B%E6%8B%92%E7%BB%9D%E5%A5%97%E8%B7%AF(1)/
脚本:
import gmpy2 import libnum e = n = dp = c = "0x7b5d1ea2d92df27239817ce8d885e1f66569dd41e075efc13d09dd1df673a8fba68ec7487c1552028e9eb9ba6663983f96d01925bbdfd18398e44f970257fa0f96b6ec915d05d637ebb4c8f4c56c44b2bb46bd1afe5a67acd640585dccf1681155308c0663cb57fccdc10c097c454dafdd2a96ccd08e9a2a8b0a9727bbe9945e579b0652d1c1d826305f0dd716cfb647cadb8eca1a0286dfb938b60b89981403d4faa6df54cfac0fa4699c97aeba6e82ab575cd6aa4421018cf9b404836c02b5301dbc475a0bcc5eef86bcbeb89a73355dbeb80e7b4d23c7a39f32c6b6138125c73892633f46b0bf1114aa67f09e1d394dfa4020e318f7d8004b84fc835b1ee9L" c = int(c[:-], ) for i in range(,): if (dp*e-)%i == : if n%(((dp*e-)/i)+)==: p=((dp*e-)/i)+ q=n/(((dp*e-)/i)+) phi = (p-)*(q-) d = gmpy2.invert(e,phi)%phi print libnum.n2s(pow(c,d,n))
关卡十八 KEYboard
首先查看流量包,可以发现是抓取了键盘输入,第三个字节是有效键位,
所以对照键位表一个个的读:https://web.archive.org/web/20160505193717if_/http://www.usb.org/developers/hidpage/Hut1_12v2.pdf
可以还原出来输入内容:
ipa<ESC>oover1<ESC>Ohonk<ESC>$jAe<ESC>As<ESC>joOF<RET>Nanle<ESC>k$3kAis<ESC>qqJxq3@qFFrfFaasswd
但观察到里面有ESC等控制符,经过不断尝试,发现是在vim里的操作,于是使用gvim,照着敲一次可以得到:
passwdishonkover1esOfNanle
所以解压密码是honkover1esOfNanle
用这个密码解压压缩包secret.zip即可。
flag{aa3783395a0e50e0cd1e714e5427d8c0cc1a7fe5}
关卡二十四 EasyRE
用IDA打开,可以看到程序会把一个固定串按照偶数位在前奇数位在后的顺序与输入进行比较。所以写出解密脚本:
#include<stdio.h> #include<string.h> int main(){ int i; char str[]="lfgaL{teU__stsr4_t3R3vSr}e"; for(i=;i<=strlen(str);i+=){ putchar(str[i+]); putchar(str[i]); } return ; }
flag{Let_Us_st4rt_R3v3rSe}
关卡二十五 EASYReverse
用IDA打开,可以看到程序是吧输入进行处理,再与一个固定串进行比较。由于处理过程涉及位运算,故无法从固定串逆推出输入,所以必须用符号执行的方式破解。
把关键的输入处理代码提取出来,稍作修改后重写出一个程序。在这个简化版的程序就可以用angr直接跑出flag。
程序代码:
#include<stdio.h> #include<string.h> int main(){ int v3,a3; // edi int v5,index; // esi char input[]; char newstr[]; char target[]="IVaQIg]:DfDcL7=VN64bF3TfEE=WCCDh<c@fM3ADHCPgME9ANGd"; scanf("%s",&input); v3 =strlen(input); a3=strlen(input); v5 = ; index=; if ( a3 - > ){ do{ newstr[index] = ((input[v5] >> ) & 0x3F) + ; newstr[index+] = ( * (input[v5] & ) | (input[v5 + ] >> ) & 0xF) + ; newstr[index+] = ((input[v5 + ] >> ) & | * (input[v5 + ] & 0xF)) + ; newstr[index+] = (input[v5 + ] & 0x3F) + ; v5 += ; index += ; } while ( v5 < a3 - ); v3 = a3; } if ( v5 < v3 ){ newstr[index] = ((input[v5] >> ) & 0x3F) + ; if ( v5 == v3 - ){ newstr[index+] = * ((input[v5] & ) + ); newstr[index+] = ; } else{ newstr[index+] = ( * (input[v5] & ) | (input[v5 + ] >> ) & 0xF) + ; newstr[index+] = * ((input[v5 + ] & 0xF) + ); } index += ; newstr[index+] = ; } newstr[index] = ; if(strcmp(newstr,target)==){ puts("yes"); } return ; }
Angr破解代码:
import angr import claripy p= angr.Project('./basere',auto_load_libs=False) state=p.factory.entry_state() simgr=p.factory.simgr(state) simgr.explore(find=lambda s: b"yes" in s.posix.dumps()) print(simgr.found[].posix.dumps())
结果就出来了:
flag{JSe3psfxa2X96USgM58346t4Ta87uRQy}
2019年领航杯 江苏省网络信息安全竞赛 初赛部分writeup的更多相关文章
- 2019全国大学生信息安全竞赛部分Web writeup
JustSoso 0x01 审查元素发现了提示,伪协议拿源码 /index.php?file=php://filter/read=convert.base64-encode/resource=inde ...
- 2019全国大学生信息安全竞赛初赛pwn前四题writeup—栈部分
ret to libc技巧:https://blog.csdn.net/zh_explorer/article/details/80306965 如何leak出libc地址:基地址+函数在libc中的 ...
- 全国大学生信息安全竞赛初赛writeup
本文首发于“合天智汇”公众号 作者:Fortheone WEB Babyunserialize 扫目录发现了 www.zip 下载下来发现似曾相识 之前wmctf2020的webweb出了f3的反序列 ...
- 浙江省第三届大学生网络与信息安全竞赛WP
title: 浙江省第三届大学生网络与信息安全预赛WP date: 2020-10-2 tags: CTF,比赛 categories: CTF 比赛 浙江省第三届大学生网络与信息安全竞赛WP 0x0 ...
- 2014年TI杯大学生电子设计竞赛地区赛使用仪器及器件、设备
2014年TI杯大学生电子设计竞赛地区赛使用仪器及器件.设备 a) 3A/30V双路稳压电源(可并联): b) 60MHz示波器: c) 三位半数字万用 ...
- 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏
2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...
- 2014年湖北省TI杯大学生电子设计竞赛论文格式
2014年湖北省TI杯大学生电子设计竞赛 B题:金属物体探測定位器(本科) 2014年8月15日 文件夹 1 系统方案 1.1 XXX的论证与选择........................... ...
- 2020 年TI 杯大学生电子设计竞赛E题总结(放大器非线性失真研究装置)
2020年TI杯大学生电子设计竞赛E题总结(放大器非线性失真研究装置) 摘要:E题的竞赛内容主要是参赛者自己搭建一个晶体管放大器,能够产生不失真.顶部失真.底部失真.双向失真和交越失真五种波形,并分别 ...
- Reverse 高校网络信息安全运维挑战赛
Reverse 高校网络信息安全运维挑战赛 1 signed int sub_403CC0() 2 { 3 unsigned int v0; // eax 4 int key_lens; // eax ...
随机推荐
- springBoot集成Redis,RedisTmple操作redis和注解实现添加和清空缓存功能
配置 maven项目进入相关配置 <dependency> <groupId>org.springframework.boot</groupId> &l ...
- java线程的生命周期及五种基本状态
一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌 ...
- DBA面对新mysql环境
来源:http://blog.csdn.net/wyzxg/article/details/8491152 author:skatetime:2013/01/10 DBA面对新MySQL环境感悟 1. ...
- 阿里云ACA—— I
ACA 阿里云大数据助理工程师 阿里云大学 大数据助理工程师课程笔记分享, 本资料仅供个人学习,不允许用作商业用途,侵权必删 == Alibaba Cloud Certification Associ ...
- 全局唯一ID生成器(Snowflake ID组成) 分析
Snowflake ID组成 Snowflake ID有64bits长,由以下三部分组成: time—42bits,精确到ms,那就意味着其可以表示长达(2^42-1)/(1000360024*365 ...
- 爬虫之cookie与代理
一, 基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达 ...
- HTML&CSS基础-常用选择器
HTML&CSS基础-常用选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html源代码 <!DOCTYPE html> <html> & ...
- Windows运维之Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机
摘要:本文主要向大家介绍了Windows运维之Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机,通过具体的内容向大家展现,希望对大家学习Windows运维有所帮助. 本 ...
- 移动魔百和PTV-8098可以免拆直接安装第三方的软件
前言:江苏用户的福音啊!当地移动魔百和PTV-8098可以免拆直接安装第三方的软件,其他地区的PTV-8098未做测试,可以自己根据教程步骤进行测试: 准备工具:8G或4G的U盘(太大无法识别).电脑 ...
- macOS 10.13允许任何来源开启方法
软件下载网站: http://www.pc6.com/ 软件安装问题: macOS 10.13允许任何来源开启方法: 如果需要恢复允许“任何来源”的选项,即关闭系统的Gatekeeper,我们可以在“ ...