NSCTF 2015解题报告

比赛昨天结束。题目下载地址:http://pan.baidu.com/s/1qWtGILY,密码:iz6l

Reverse01

使用ExeinfoPe查壳,程序使用 Aspack v2.24 - 2.34 加了壳。

NSCTF 2015解题报告_第1张图片

手工脱一下壳:

单步执行pushad,后在esp下寄存器断点

NSCTF 2015解题报告_第2张图片

NSCTF 2015解题报告_第3张图片

F9继续执行,在此处断下:

NSCTF 2015解题报告_第4张图片

F8单步来到OEP位置

NSCTF 2015解题报告_第5张图片

直接使用OllyDump插件脱壳

NSCTF 2015解题报告_第6张图片

将dump出的程序拖入IDA,此时可正常显示main函数,F5之

NSCTF 2015解题报告_第7张图片

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

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

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

NSCTF 2015解题报告_第8张图片

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

NSCTF 2015解题报告_第9张图片

Reverse02

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

NSCTF 2015解题报告_第10张图片

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

NSCTF 2015解题报告_第11张图片

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

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

NSCTF 2015解题报告_第12张图片

写破解代码:

#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}



你可能感兴趣的:(NSCTF 2015解题报告)