NSCTF 2015 Reverse Writeup

NSCTF 2015 Reverse Writeup

一、Reverse 1

查壳是aspack的壳,用esp定律到达oep后搜索代码段字符串,发现有两处与flag先关字符串,其中一处是混淆。真实生成flag数据的代码如下:

直接在函数头新建eip,运行下去就能看到真正的flag。

二、Reverse 2

和Reverse1一样,直接搜索flag相关字符,找到关键生成flag的地方(其实一般都是在代码段的靠前部分)。

一样在函数头新建eip,运行生成flag:

三、Reverse 3

运行Reverse3首先会在临时目录释放相关文件:

之后会修改STARTUPINFO重新创建进程,并且等待新进程结束:

这里的解决方法是找到断当前进程是否是可进入验证过程的关键地方,并且修改。并将临时文件复制到当前目录。

这里修改始终不跳转,进入验证过程。验证是导入python脚本来执行的,这个从临时文件中有python27.dll就能看出。跟踪python导入运行部分能发现关键获取python脚本的位置,

提取脚本如下:

这里buf里面的flag是非法的,真实的flag是由data替换buf后运行得到的。

四、Reverse 4

这题是python逆向题,主要涉及python字节码的还原。原pyc文件对前面几位字节码进行了混淆修改,导致了一些py代码还原工具没法正常工作。好在python自带有dis模块,可以对py字节码进行解析,通过字节码我们也能还原出大致的代码。

主模块部分的字节码如下:

可以看出这里有5个GetFlag函数,而程序默认调用的是GetFlag1,由此可以猜出真正的flag是由另外4个其中一个GetFlag函数来获取的。关键是需要对代码进行还原,如下是还原后的代码:

最后得出从GetFlag4可以获取真正的flag。

五、Reverse 5

使用IDA对程序进行逆向:

Main函数部分,绑定2994端口:

*************************************************************************

监听部分:

监听部分接受3个指令:

ENCRYPT:进行数据计算。

STATUS:可以获取当前程序主模块的基址。

EXIT:退出。

*************************************************************************

ENCRYPT处理部分:

这里如果未分配随机数就会先分配32个随机数,参与之后的运算。运算是输入数据与随机数进行异或,结果存在堆栈内存中。

之后函数返回后程序会将运算后的数据send到客户端。

漏洞点:

在ENCRYPT运算中未限制运算数据的长度,导致运算可以溢出缓冲区,覆盖堆栈上的数据。

漏洞利用:

① 先发送‘STATUS’获取模块基址

② 发送‘ENCRYPT ’+正规长度为32*4值都为0的数据,以获取所有32个随机数的值。

③ 发送‘ENCRYPT ’+超出正规长度的数据导致缓冲区溢出。这里根据模块基址以及随机数的值来确定数据,使运行时溢出堆栈数据可控。

Exploit:

六、Reverse 6

同样使用IDA对程序进行逆向:

口令认证:

在操作码为0的登陆过程中,紧随username的是一个验证口令,口令验证过程如下:

可以看出base64(md5(key))==”MjY5MzRlYjM3NzAwMWY2NmUzNzI4OWE1YzkzZmUyODQ=”,最后得出key=”failed”

可利用漏洞:

客户端可以发送操作码为2的移动配置文件的指令:

在移动配置文件中客户端可以自定义文件名,并且此时的不会对文件名的合法性以及长度进行检测:

漏洞利用:

① 先进行登录。(操作码为0)

② 执行exploitMeDll.dll中的GetGlobalFunction,GetStatus函数。(操作码为4)

③ 根据exploitMeDll.dll函数返回结果获取DllModuleBase和Path

④ 执行保存配置命令(操作码为1)

⑤ 根据DllModuleBase和path信息构造bad文件名

⑥ 使用bad文件名执行移动配置文件命令(操作码为2)

Exploit:

 

makings:

nsctf_2015.zip

发表评论

电子邮件地址不会被公开。 必填项已用*标注