转载

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

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

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

Reverse01

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

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

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

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

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

F9继续走起,此处断下:

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

F8单步来到OEP位置

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

直接使用OllyDump插件脱壳

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

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

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

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

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

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

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

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

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

Reverse02

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

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

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

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

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

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

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

最后,编写破解代码:

破解代码

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}

python逆向

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

Reverse400

Reverse500

难题挑战

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

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

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

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

正文到此结束
Loading...