NSCTF线上比赛9.28号结束的,网络上已经有了大部分线上解题的write up,本次线上赛总共24道题目,其中Web占据半壁江山12道,逆向6题,加解密3道,综合题3道。这里部分参考 @绿盟科技 给出逆向的write up,同时感谢@CN_ezreal分享的windows逆向的题目以及部分解题思路。
题目下载地址 Reverse01&Reverse02 ,密码:iz6l
直接运行,提示输入密码,随便输入后,报错。接着查壳,壳的信息如下:
加的是 Aspack v2.24 – 2.34,这个壳比较简单,可以直接使用ollydump插件手工脱壳。
寻找OEP。单步执行pushad,后在esp下寄存器断点
F9继续走起,此处断下:
F8单步来到OEP位置
直接使用OllyDump插件脱壳
将dump出的程序拖入IDA,此时脱壳后的程序可正常显示main函数,利用IDA的F5反编译插件,查看:
sub_401000函数才是真正输出flag的位置,注意v4指针与Format指的位置关系
char Format; // [sp+0h] [bp-38h]@1
char v4; // [sp+Fh] [bp-29h]@1
因此先输入3次错误密码,再输入nsF0cuS!x01,即输出正确flag
首先,Reverse02程序没有加壳,有反调试。拖入IDA分析,定位到关键函数GetDlgItemTextA。
很明显,它将从dlg框中取的值传给sub_401070函数,接下来需要重点分析这个函数。
跟进去后发现,该函数将输入字符串,与byte_4030xx处的字符与(7或0x33)的异或比较。MessageBoxA处猜测为输出真正flag位置。
转换一下进制显示,byte_4030xx处字符分别为“JPFjXj2;9GWbN”
最后,编写破解代码:
破解代码
C
#include <stdio.h> int main() { int i, j = 0; char str1[] = "JPFjXj2;9GWbN"; char str2[20] = {0x00}; for (i = 0; i <= 6; i++) { str2[j++] = str1[12-i] ^ 7; } for (i = 5; i >= 0; i--) { str2[j++] = str1[i] ^ 0x33; } printf("%s/n", str2); return 0; }
输入运算出的Key值,发现GetFlag按钮还是灰的,用Spy++激活之,得到flag:
flag:{NSCTF_md50b7dfc60761e798328a0d9793f96d4f7}
在这里其实已经找到decode函数了,地址为sub_401000:
C
int sub_401000() { char *v0; // eax@1 CHAR Text; // [sp+0h] [bp-38h]@1 char Dst; // [sp+1h] [bp-37h]@1 char v4; // [sp+Fh] [bp-29h]@1 Text = 0; memset(&Dst, 0, 0x30u); strncpy_s(&Text, 0x31u, "flag:{NSCTF_md57e0cad17016b0>? 45?f7c>0>4a>1c3a0}", 0x30u); v0 = &v4; // *v4 = "7e0cad17016b0>?45?f7c>0>4a>1c3a0}" if ( v4 != 125 ) { do { *v0 ^= 7u; ++v0; } while ( *v0 != 125 ); } return MessageBoxA(0, &Text, "Flag", 0); }
这段代码其实就是对”7e0cad17016b0>?45?f7c>0>4a>1c3a0″进行相应计算,python破解代码如下:
Python
a = "7e0cad17016b0>?45?f7c>0>4a>1c3a0" out = "" for i in a: out += chr(ord(i)^7) print out # 0b7dfc60761e798328a0d9793f96d4f7
最终也可以得到flag:{NSCTF_md50b7dfc60761e798328a0d9793f96d4f7}
这两道题的知识点比较新颖,这里直接给出@w3b0rz的解题思路:
Reverse400
Reverse500
为了让大家体验线上赛的精彩,绿盟科技博客与NSCTF主办方沟通,特别开放一道题目 Reverse1500 (提取密码:vuqh)出来,供大家练手。 这个程序自身存在漏洞,需要大家通过逆向分析发现该程序的漏洞, 构造自己的漏洞利用程序,完成执行任意代码的任务。该题目的考点有 1分析程序的协议;2绕过系统的保护如ASLR和DEP;3构造shellcode完成利用。答案在这里 exploit_1500 。
“相比较而言 exploit 3000 就比较复杂了,刚开始我都打算放弃了,但是看到自己的排名不停地跌想想不做不行啊,于是就开始埋头挖洞”——w3b0rz
同样这里给出 @w3b0rz 的解题思路。
【本文思路整理by:91RI团队-Leon】