题目:

注意进入正确的流程,用最短的步骤走完迷宫。

解题链接: http://ctf5.shiyanbar.com/423/re/rev2.exe

过程

IDA打开:

顺着去找main函数:

int main_0()
{size_t v0; // eaxsize_t v1; // eaxchar v3[48]; // [esp+4Ch] [ebp-3Ch]unsigned int v4; // [esp+7Ch] [ebp-Ch]unsigned int v5; // [esp+80h] [ebp-8h]int v6; // [esp+84h] [ebp-4h]v5 = 0;v4 = 0;v6 = 0 / 0;printf("Please input your key:\n");gets(v3);if ( strlen(v3) > 0x20 ){printf("Too long!\n");}else{v4 = 0;v3[strlen(v3)] = 0;if ( strlen(v3) ){do{if ( !isalpha(v3[v4]) && v3[v4] != 123 && v3[v4] != 125 && v3[v4] != 95 )// 不是是字母,且不是{,不是_,不是},就错了;即要求输入是字母,'{','_','}'中的一个{printf("Sorry,you are wrong!\n");exit(0);}++v4;v0 = strlen(v3);}while ( v4 < v0 );}_strlwr(v3);                                // 将字符串中的字母转化为小写,也就是输入时不分大小写是对的v5 = 0;if ( strlen(v3) ){do{v3[v5++] += 128;v1 = strlen(v3);}while ( v5 < v1 );}if ( !strcmp(v3, &byte_425A30) )            // &byte_425A30中的数字减去128就是答案,长度是19个字符printf("Good!\n");elseprintf("Sorry,you are wrong!\n");system("pause");}system("pause");return 0;
}
.data:00425A30 byte_425A30     db 0F4h                 ; DATA XREF: _main_0:loc_401520↑o
.data:00425A31                 db 0E8h
.data:00425A32                 db 0E9h
.data:00425A33                 db 0F3h
.data:00425A34                 db 0DFh
.data:00425A35                 db 0E9h
.data:00425A36                 db 0F3h
.data:00425A37                 db 0DFh
.data:00425A38                 db 0E1h
.data:00425A39                 db 0DFh
.data:00425A3A                 db 0E6h
.data:00425A3B                 db 0E1h
.data:00425A3C                 db 0EBh
.data:00425A3D                 db 0E5h
.data:00425A3E                 db 0DFh
.data:00425A3F                 db 0E6h
.data:00425A40                 db 0ECh
.data:00425A41                 db 0E1h
.data:00425A42                 db 0E7h

写个脚本提取出来:

import idc
str = ""
#最后的地址要加一,因为range函数尾巴是小于
for i in range(0x00425A30,0x00425A42+1,1):str += chr(int(GetOpnd(i,1)[0:3],16)-128)#因为带着h所以要通过下标把h去掉[0:3]代表0F4、0E8等三个位的数,[0:2]只是0F、0E等。(i,1)代表第一个操作数
print str  

说是一个假的flag:

静态分析有时候IDA还是会被欺骗,main函数不一定是核心函数

动态调试

如果单步执行的话到这里就不能再往下了,应该是前面的哪一步有反调试的手段,或者我还没学会的调试方法。

可以确定没有进main,也不知怎么回事,但可以发现有好几个 sorry

回到IDA后字符串搜索锁定到 sub_401020

char *sub_401020()
{char *result; // eaxchar *v1; // [esp+50h] [ebp-CCh]char v2; // [esp+54h] [ebp-C8h]char v3; // [esp+5Dh] [ebp-BFh]char v4; // [esp+94h] [ebp-88h]char v5; // [esp+98h] [ebp-84h]char v6; // [esp+99h] [ebp-83h]__int16 v7; // [esp+10Dh] [ebp-Fh]char v8; // [esp+10Fh] [ebp-Dh]char v9; // [esp+110h] [ebp-Ch]char v10; // [esp+114h] [ebp-8h]int v11; // [esp+118h] [ebp-4h]v5 = 0;memset(&v6, 0, 116u);v7 = 0;v8 = 0;strcpy(&v2, "********* *    ** * ** ** * ** ** * #* ** **** **      *********");// 迷宫地图v1 = &v3;printf("Please input your key:\n");           // 输入走的过程gets(&v5);if ( strlen(&v5) != 22 )                      // 步数为22步{printf("Sorry you are wrong!\n");system("pause");exit(1);}v11 = 0;do{v10 = *(&v5 + v11);                         // v10就是input[i]if ( v10 != 'k' && v10 != 'j' && v10 != 'h' && v10 != 'l' )// 输入必须是 hjkl 字符中的一个{printf("Sorry you are wrong!\n");system("pause");exit(2);}v9 = *(&v5 + v11);                          // v9也是input[i]switch ( v9 ){case 'h':if ( --v1 < &v2 || v1 > &v4 || (result = (char *)*v1, result == (char *)'*') ){printf("Sorry you are wrong!\n");system("pause");exit(3);}if ( *v1 == '#' ){
LABEL_41:printf("Good!\n");system("pause");exit(0);}break;case 'j':v1 += 8;                                // 根据这里的 +=8 判断二维迷宫一行8个,即://     ********//     * *    *//     * * ** *//     * * ** *//     * * #* *//     * **** *//     *      *//     ********if ( v1 < &v2 || v1 > &v4 || *v1 == '*' )// v2是字符串,猜测v4是0; 综合jhkl的v1关于8的操作,则j是向下,k是向上,h是向左,default即l是向右{printf("Sorry you are wrong!\n");system("pause");exit(3);}result = (char *)*v1;if ( result == (char *)'#' )goto LABEL_41;break;case 'k':v1 -= 8;if ( v1 < &v2 || v1 > &v4 || *v1 == '*' ){printf("Sorry you are wrong!\n");system("pause");exit(3);}result = v1;if ( *v1 == '#' )goto LABEL_41;break;default:if ( ++v1 < &v2 || v1 > &v4 || *v1 == 42 ){printf("Sorry you are wrong!\n");system("pause");exit(4);}result = v1;if ( *v1 == '#' )goto LABEL_41;break;}++v11;}while ( v11 < 25 );return result;
}

分析一下:

试了一下从左上角出发正好是22步:jjjjjlllllkkkkkhhhjjjl

实验吧(逆向):分道扬镳相关推荐

  1. [网安实践III] 实验3.逆向分析

    [网安实践III] 实验3.逆向分析 1 流量分析 借助Wireshark抓取Android模拟器中"QQ同步助手"登录和同步数据时的流量,回答以下问题: (1)筛选流量中,对应域 ...

  2. 实验吧 逆向defcamp r200.bak伪代码逻辑分析的坑

    实验吧逆向题defcamp r200.bak 解题思路网上有很多,这里主要写一下小白在研究过程中遇到的两个坑 第一个:反调试 一开始以为是代码故意死循环,需要修改:后来看了参考(https://www ...

  3. 实验吧逆向catalyst-system——WP

    0x0: 在linux里跑一下 要求输入用户名 密码 0x1: 拖进IDA 查看关键字符串,找到关键函数F5查看伪代码. 0x2:400C9A函数 #include<stdio.h> #i ...

  4. 逆向分析入门实战(二)

    上次我们对主函数分析完成了,逆向入门分析实战(一)那么这次我们对子函数IsAlreadyRun进行分析. C语言代码 IsAlreadyRun函数的C语言代码如下图所示: 下面对其汇编代码进行分析: ...

  5. 基于字典的中文分词算法RMM

    引言:目前针对中文分词一般有基于字典,基于统计(HMM等),基于规则的分词方法,然而其中基于字典的中文分词是最基础,同时也是最高效的方式,但分词精度取决与字典的规模. 一.基于字典的中文算法简介 1. ...

  6. 基于字典的中文分词算法RMM,MM实现

    引言:目前针对中文分词一般有基于字典,基于统计(HMM等),基于规则的分词方法,然而其中基于字典的中文分词是最基础,同时也是最高效的方式,但分词精度取决与字典的规模. 一.基于字典的中文算法简介 1. ...

  7. python绘制好几个子图_python使用matplotlib:subplot绘制多个子图 不规则画图

    Regionals 2012 :: HangZhou 题目传送门排行榜 一个人做了12年北大出的题,自己还是太弱了,图论的知识忘光光,最小生成树裸题写不来,Dijkstra TLE不知道用SPFA. ...

  8. 2017年,那些冷门却逆天的APP应用

    作者:德鲁大叔,微信公众号:黑眼豆豆写字的地方 全文共 4274 字 19 图,阅读需要 9 分钟 ---- / BEGIN / ---- 随着移动互联网的快速发展,手机App应用和人们联系越来越密切 ...

  9. AI+Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!

    AI for Science被广泛认为是下一代科研范式,可以有效处理多维度.多模态.多场景下的模拟和真实数据,解决复杂推演计算问题,加速新科学问题发现[1] .百度飞桨科学计算工具组件赛桨Paddle ...

最新文章

  1. python流行的爬虫框架_Python爬虫相关框架
  2. 启动docker容器时报错:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT -
  3. 体验最火的敏捷-SCRUM!(网络直播课程 免费)
  4. alv 刷新_钜献 | 60小时刷新你的雅思托福成绩!明早9点我们要搞事情了!
  5. dock模拟macos教程_将macOS首选项窗格添加到您的Dock中以快速访问
  6. gRPC基础--Protobuf编码格式详解
  7. FTServer 0.9 发布,全文搜索服务器
  8. 聚宽macd底背离_老股民技巧一招鲜:MACD顶、底背离图解及近期实战应用,字字斗金...
  9. yum安装提示yum.pid被锁定解决办法
  10. access查询设计sol视图_Access删除索引
  11. 常见的几种负载均衡技术
  12. Netscreen ×××配置(一)---基于策略的点到点×××设置
  13. NKOI 3539 移棋子游戏[6月月赛题A]
  14. 第6节 Tableau 直方图 | 评分直方图
  15. 可执行MIPS指令的单周期CPU
  16. 工控组态编程相关知识点介绍
  17. nmap的下载与安装
  18. 15_Elasticsearch 内部原理详细解析(下篇)
  19. 知识图谱-KGE-第三方库:LibKGE库【包含:TransE、TransH、ConvE、DistMult、ComplEx、TuckER、SimplE...】
  20. Linux创建share共享文件夹

热门文章

  1. 蓝桥杯软件组如何混进省一
  2. 仲联量行:科技行业繁荣推动深圳成为中国内地第三大办公楼市场
  3. php做网站步骤_php建一个网站步骤
  4. android studio freeline,Android Studio配置freeline遇到的问题
  5. 各种线 你想知道的都在这里
  6. 网页中嵌入Flash的方法讨论
  7. PSO(粒子群算法)MATLAB仿真完整代码
  8. Linux 运维必会的150个常用命令,你都会用吗?
  9. 360版nod32病毒库无法更新
  10. python+opencv 计算图片的感知hash值,来计算汉明距离,简单的找相似图片