测试文件:https://static2.ichunqiu.com/icq/resources/fileupload//CTF/JCTF2014/re200

参考文章:https://blog.csdn.net/chenlycly/article/details/53378196

1.程序分析

检测时发现不是PE文件,但是打开16进制却发现了MZ标识,因此我们能够判断文件中存在错误。

1.1 第一处错误

通过观察,发现指向PE文件头的地址为E9,但是实际的地址却是E8。

1.2 第二处错误

将地址修改正确之后,在010Editor打开文件,导入EXE模板

可以看到,正确的PE文件标识应该是0x00004550,但是文件中是0x00FF4550,修改FF为00

将修改后的文件保存为EXE文件

2.IDA打开

定位到main函数

 __int64 __cdecl main_0()
{
int v0; // eax
__int64 v1; // rax
int v2; // eax
int v3; // ST08_4
int v4; // eax
int v5; // eax
int v6; // eax
int v7; // eax
int v8; // eax
int v9; // eax
int v11; // [esp-10h] [ebp-170h]
int v12; // [esp-Ch] [ebp-16Ch]
char *v13; // [esp-8h] [ebp-168h]
int v14; // [esp-4h] [ebp-164h]
int *v15; // [esp+Ch] [ebp-154h]
int k; // [esp+D4h] [ebp-8Ch]
int j; // [esp+E0h] [ebp-80h]
int i; // [esp+ECh] [ebp-74h]
char v19; // [esp+FBh] [ebp-65h]
int v20; // [esp+104h] [ebp-5Ch]
int Dst; // [esp+108h] [ebp-58h]
int v22; // [esp+10Ch] [ebp-54h]
int v23; // [esp+110h] [ebp-50h]
int v24; // [esp+114h] [ebp-4Ch]
int v25; // [esp+118h] [ebp-48h]
char Str1; // [esp+14Ch] [ebp-14h]
int v27; // [esp+14Dh] [ebp-13h]
int v28; // [esp+151h] [ebp-Fh]
char v29; // [esp+155h] [ebp-Bh] v0 = sub_411154(std::cout, "欢迎来到数字游戏 请输入9个数字");
std::basic_ostream<char,std::char_traits<char>>::operator<<(v0, std::endl);
Str1 = ;
v27 = ;
v28 = ;
v29 = ;
v20 = ;
j_memset(&Dst, , 0x3Cu);
for ( i = ; i < ; ++i )
std::basic_istream<char,std::char_traits<char>>::operator>>(std::cin, &v20 + i);// v20中输入9个数字
if ( v22 * Dst * v20 / != ) // 需要满足条件1
goto LABEL_31;
if ( (Dst ^ v20) != v22 - ) // 需要满足条件2
goto LABEL_31;
HIDWORD(v1) = (v22 + Dst + v20) % ; // v1的计算表达式,反向推倒,需要满足条件3
if ( HIDWORD(v1) != ) // v1 = 34
goto LABEL_31;
if ( v23 == ) // v23=80
{
for ( j = ; j < ; ++j )
{
HIDWORD(v1) = (j + ) % ;
for ( *(&Str1 + j) = *((_BYTE *)&v20 + * HIDWORD(v1)) + *(&v20 + j % ); ; *(&Str1 + j) /= )
{
while ( *(&Str1 + j) < )
{
HIDWORD(v1) = j;
*(&Str1 + j) *= ;
}
if ( *(&Str1 + j) <= )
break;
v1 = *(&Str1 + j);
}
}
if ( v24 == && v25 == ) // v24=94,v25=98
{
for ( k = ; k < ; ++k )
{
for ( *(&Str1 + k) = *(&Str1 + (k + ) % ) + *(&Str1 + k % ); ; *(&Str1 + k) /= )
{
while ( *(&Str1 + k) < )
*(&Str1 + k) *= ;
if ( *(&Str1 + k) <= )
break;
}
}
if ( !j_strcmp(&Str1, "*&8P^bP^b") )
{
v2 = sub_411154(std::cout, "success!");
std::basic_ostream<char,std::char_traits<char>>::operator<<(v2, std::endl);
v14 = std::endl; // 换行
v13 = "abc}";
v12 = v22;
v11 = Dst;
v3 = v20;
v15 = &v11;
v4 = sub_411154(std::cout, "jlflag{");
v5 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v4, v3);
v6 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v5, v11);
v7 = std::basic_ostream<char,std::char_traits<char>>::operator<<(v6, v12);
v8 = sub_411154(v7, v13);
std::basic_ostream<char,std::char_traits<char>>::operator<<(v8, v14);// 以上输出的组合为v4 v3 v11 v12 v13 v14
sub_4112D0(std::cin, &v19);
goto LABEL_32;
}
LABEL_31:
v9 = sub_411154(std::cout, "please try again!");
std::basic_ostream<char,std::char_traits<char>>::operator<<(v9, std::endl);
goto LABEL_32;
}
}
LABEL_32:
v14 = HIDWORD(v1);
v13 = ;
return *(_QWORD *)&v13;
}

2.1 代码分析

通过第90~94行代码,我们知道正确的flag为组合[v4 v3 v11 v12 v13 v14],其中v4="jlflag{",v13="abc}",v14=std::endl

因此我们只需要求出v3,v11,v12即可,通过第85~87行代码,我们知道v12 = v22;v11 = Dst;v3 = v20;

我们能够通过这三个变量满足的三个表示,求出三个数的值。

3.脚本获取

for v22 in range(100):
for dst in range(100):
for v20 in range(100):
if v22*dst*v20//11 == 106 and (v22 + dst + v20) % 100 == 34:
if (dst^v20) == v22 - 4:
if (v22 + dst + v20) % 100 == 34:
print("jlflag{%d%d%dabc}"%(v22, dst, v20), end='\n')

jlflag{61315abc}
jlflag{61513abc}
jlflag{13615abc}
jlflag{13156abc}
jlflag{15613abc}
jlflag{15136abc}

将这6组得到的flag一组一组试,就能得到正确flag。(记得去掉jl

4.get flag!

flag{15613abc}

JCTF 2014 小菜两碟的更多相关文章

  1. JCTF 2014 小菜一碟

    测试文件:https://static2.ichunqiu.com/icq/resources/fileupload//CTF/JCTF2014/re100 1.准备 获得信息 ZIP文件 Java文 ...

  2. JCTF 2014(Reverse)

    小菜一碟: 点击下载附件 下载的附件没有后缀,用c32打开看看 是apk文件,用Smali2JavaUI打开 程序把输入框的字符串反转,然后进行MD5加密,最后进行base64编码,与NzU2ZDJm ...

  3. ▲教你如何轻易的做linux计划任务▲——小菜一碟

    一次性计划任务的安排: at :安排作业在某一时刻执行一次(一般都是用它) batch:安排作业在系统负载不重时执行一次 第一步: #service atd start  开启一次性计划任务   at ...

  4. JCTF 2014(Misc)

    小试身手: 点击下载附件 res/raw/hehe,打开 得到flag

  5. java制作二维码的两种方式

    原博:http://www.importnew.com/15028.html Zebra Crossing(ZXing)是一个很棒的,几乎可以在所有平台(Android.JavaSE.iPhone.R ...

  6. SQL Server 2014与TFS 2013的错误(TF53001:管理员已取消数据库操作)

    服务器环境: - TFS 2013 with Update 2 - SQL Server 2014(两个节点数据库服务器配置了AlwaysOn高可用性) - Windows Server 2012 R ...

  7. 转载:iOS开发之让你的应用“动”起来

    在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画 ...

  8. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  9. [翻译]用 Puppet 搭建易管理的服务器基础架构(4)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第四部分. 原文地址:http://blog.jobbole.com/89214/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...

随机推荐

  1. js怎么上传文件夹

    1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...

  2. 根据linux自带的JDK,配置JAVA_HOME目录

    在配置hadoop是,进行格式化hadoop的时候,出现找不到jdk 我用centos6.5是64位的, 发现本机有java ,就找了一下其位置 找到了jdk-1.7.0_75 which java ...

  3. jQuery easyui datagrid 的数据加载

        其实easyuidatagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数据:另一种是加载js对象,也就是使用loadDate方法,这种方法用于加载本地js数据(非ur ...

  4. 【重点突破】—— UniApp 微信小程序开发官网学习Two

    一.使用Vue.js注意事项 Vue.js在uni-app中使用的差异: 新增:uni-app除了支持Vue实例的生命周期,还支持应用启动.页面显示等生命周期 受限:发布到H5时支持所有vue的语法, ...

  5. pyhton2与pyhton3切换

    ubuntu中默认的Python版本是Python2.X,但是现在Python的最新版本是Python3.X. 那么怎么修改ubutun系统默认的Python解释器呢? 如果没有安装,则使用以下命令安 ...

  6. webpack4常用片段

    webpack 4常用 初始化 npm init // Webpack 4.0以后需要单独安装 npm install webpack webpack-cli --save-dev 基础的config ...

  7. 通过 vSphere WS API 获取 vCenter Datastore Provisioned Space 置备空间

    目录 文章目录 目录 Provisioned Space & Used Space Provisioned Space 的计算方式 Uncommitted Space 扩展:置备率的计算公式 ...

  8. 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 nvarchar

    .TrimEnd() 怀疑是否SqlBulkCopy是否存在某种bug,故而在系统中改写代码,用单个sql的插入数据方式,用循环逐条导入.结果是没问题.难道真的是SqlBulkCopy有某种bug?上 ...

  9. PHP开发一个简单的成绩录入系统

    预览界面 源码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  10. Tensorflow模型保存与载入

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = in ...