NSCTF网络安全攻防大赛逆向部分write up

NSCTF线上比赛9.28号结束的,网络上已经有了大部分线上解题的write up,本次线上赛总共24道题目,其中Web占据半壁江山12道,逆向6题,加解密3道,综合题3道。这里部分参考@绿盟科技给出逆向的write up,同时感谢@CN_ezreal分享的windows逆向的题目以及部分解题思路。

题目下载地址Reverse01&Reverse02,密码:iz6l

Reverse01

直接运行,提示输入密码,随便输入后,报错。接着查壳,壳的信息如下:

211012_heQn_2456913

加的是 Aspack v2.24 – 2.34,这个壳比较简单,可以直接使用ollydump插件手工脱壳。

寻找OEP。单步执行pushad,后在esp下寄存器断点

QQ截图20150930113813

F9继续走起,此处断下:

211311_lsCc_2456913

F8单步来到OEP位置

211351_OPS5_2456913

直接使用OllyDump插件脱壳

211439_Nmhc_2456913

将dump出的程序拖入IDA,此时脱壳后的程序可正常显示main函数,利用IDA的F5反编译插件,查看:

211734_2YKF_2456913

sub_401000函数才是真正输出flag的位置,注意v4指针与Format指的位置关系

char Format; // [sp+0h] [bp-38h]@1

char v4; // [sp+Fh] [bp-29h]@1

212301_WljK_2456913

因此先输入3次错误密码,再输入nsF0cuS!x01,即输出正确flag

QQ截图20150930154320

Reverse02

首先,Reverse02程序没有加壳,有反调试。拖入IDA分析,定位到关键函数GetDlgItemTextA。

212710_LTXD_2456913

很明显,它将从dlg框中取的值传给sub_401070函数,接下来需要重点分析这个函数。

212904_e7LN_2456913

跟进去后发现,该函数将输入字符串,与byte_4030xx处的字符与(7或0x33)的异或比较。MessageBoxA处猜测为输出真正flag位置。

转换一下进制显示,byte_4030xx处字符分别为“JPFjXj2;9GWbN”

213306_PoXD_2456913

最后,编写破解代码:

输入运算出的Key值,发现GetFlag按钮还是灰的,用Spy++激活之,得到flag:

flag:{NSCTF_md50b7dfc60761e798328a0d9793f96d4f7}

在这里其实已经找到decode函数了,地址为sub_401000:

这段代码其实就是对”7e0cad17016b0>?45?f7c>0>4a>1c3a0″进行相应计算,python破解代码如下:

最终也可以得到flag:{NSCTF_md50b7dfc60761e798328a0d9793f96d4f7}

python逆向

这两道题的知识点比较新颖,这里直接给出@w3b0rz的解题思路:

Reverse400

Reverse500

难题挑战

为了让大家体验线上赛的精彩,绿盟科技博客与NSCTF主办方沟通,特别开放一道题目Reverse1500(提取密码:vuqh)出来,供大家练手。 这个程序自身存在漏洞,需要大家通过逆向分析发现该程序的漏洞, 构造自己的漏洞利用程序,完成执行任意代码的任务。该题目的考点有 1分析程序的协议;2绕过系统的保护如ASLR和DEP;3构造shellcode完成利用。答案在这里exploit_1500

“相比较而言 exploit 3000 就比较复杂了,刚开始我都打算放弃了,但是看到自己的排名不停地跌想想不做不行啊,于是就开始埋头挖洞”——w3b0rz

同样这里给出@w3b0rz的解题思路。

【本文思路整理by:91RI团队-Leon】