码迷,mamicode.com
首页 > 其他好文 > 详细

NSCTF 2015解题报告

时间:2015-09-28 22:31:40      阅读:519      评论:0      收藏:0      [点我收藏+]

标签:

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

Reverse01

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

技术分享

手工脱一下壳:

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

技术分享

技术分享

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

技术分享

F8单步来到OEP位置

技术分享

直接使用OllyDump插件脱壳

技术分享

将dump出的程序拖入IDA,此时可正常显示main函数,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

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

技术分享

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

技术分享

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

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

技术分享

写破解代码:

#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解题报告

标签:

原文地址:http://my.oschina.net/cve2015/blog/512076

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!