花指令分析

如果没接触过花指令,先看这个博客,大致了解一下花指令

https://www.cnblogs.com/Here-is-SG/p/15802040.html

点击此处下载附件

查壳

32位,无壳

去除花指令

用32位ida打开,就看到红色字体的XREF(非自然程序流程,可以用它对程序流进行跟踪和控制,估计以后有的学了),这时候F5反编译,发现没有反应,再联系题目,推测有花指令(也就是红色字体的XREF)影响ida进行编译。



又看到它附近有jz和jnz



我们找到地址loc_4010D4,然后按u

可以发现loc_4010D4+1的+1没了,变成函数unk_4010D5



然后从有XREF的这一行选中下面所有数据,按c,选择Analyze



按完后,就变成正常的汇编代码了



然后需要把db 0E9h进行nop处理,使数据变成90,再按c,变成汇编代码





再在上面翻,找到主函数并在此处按p,解析成函数,即可F5了





F5,查看伪代码

分析代码

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
signed int v3; // kr00_4
int i; // edx
char v5; // cl
unsigned int j; // edx
int v7; // eax
char v8; // [esp+0h] [ebp-44h]
char v9; // [esp+0h] [ebp-44h]
char Arglist[48]; // [esp+10h] [ebp-34h] BYREF sub_401020("please input flag\n", v8);
sub_401050("%s", (char)Arglist);
v3 = strlen(Arglist);
for ( i = 0; i < v3 / 2; ++i )
{
v5 = Arglist[2 * i];
Arglist[2 * i] = Arglist[2 * i + 1];
Arglist[2 * i + 1] = v5;
}
for ( j = 0; j < strlen(Arglist); ++j )
Arglist[j] ^= 0x30u;
v7 = strcmp(Arglist, "c~scvdzKCEoDEZ[^roDICUMC");
if ( v7 )
v7 = v7 < 0 ? -1 : 1;
if ( !v7 )
{
sub_401020("yes", v9);
exit(0);
}
sub_401020("error", v9);
exit(0);
}

这段代码的意思是将flag先后经过两次for循环加密,最后得到字符串c~scvdzKCEoDEZ[^roDICUMC

写脚本

flag = [0] * 24
tmp = 'c~scvdzKCEoDEZ[^roDICUMC' for i in range(0,24):
flag[i] = chr(ord(tmp[i]) ^ 48) for i in range(0,12):
v5 = flag[2 * i]
flag[2 * i] = flag[2 * i + 1]
flag[2 * i + 1] = v5 print("".join(flag))

写这个脚本遇到的困难:

  • 不知道字符串怎么和数字进行异或

解决:

第一步:将flag初始化为固定长度的列表:flag = [0] * 24。

在Python中,[0] * 24表示创建一个包含24个0的列表。这种语法可以用来快速创建指定长度的列表,并将其初始化为相同的值。在这个例子中,我们创建了一个长度为24的列表,并将其初始化为0。这个列表在后续的代码中被用来存储计算结果。

第二步:先将tmp字符串转换成整数,即加个ord()函数,然后与数字进行异或,异或完之后再转换成字符,即加个chr()函数。

ord()函数主要用于将字符转换为整数,即获取ASCII给定字符的值;返回的结果是对应字符的ASCII码

chr()函数是ord()函数的配对函数,主要用一个范围内的整数作参数,返回的结果是对应的字符,可以用十进制或者十六进制。

  • 最后如果直接输出flag,是个序列形式,不方便



解决:

使用Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。



这样就好多了

flag:**NSSCTF{Just_junk_Bytess}**

[HNCTF 2022 WEEK2]e@sy_flower的更多相关文章

  1. NewStarCTF 公开赛 2022 RE WP

    Week 2 Re 前可见古人,后得见来者 chipher = [0x51, 0x5B, 0x4C, 0x56, 0x59, 0x4D, 0x50, 0x56, 0x54, 0x43, 0x7D, 0 ...

  2. Spark小课堂Week2 Hello Streaming

    Spark小课堂Week2 Hello Streaming 我们是怎么进行数据处理的? 批量方式处理 目前最常采用的是批量方式处理,指非工作时间运行,定时或者事件触发.这种方式的好处是逻辑简单,不影响 ...

  3. CJOJ 2022 【一本通】简单的背包问题(搜索)

    CJOJ 2022 [一本通]简单的背包问题(搜索) Description 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,-wn. 问能否从这n件物品中选择若干件放入 ...

  4. 我的java之路week2类的无参、带参方法

    2.1语法 public 返回值类型 方法名(){ //方法体 } 2.2方法的调用语法 对象名.方法名 计算平均分和总成绩 public class Score { /** * 创建类 ScoreC ...

  5. 海量数据挖掘MMDS week2: 局部敏感哈希Locality-Sensitive Hashing, LSH

    http://blog.csdn.net/pipisorry/article/details/48858661 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  6. 集大软件工程15级个人作业Week2

    集大软件工程15级个人作业Week2 快速通读教材<构建之法>,并参照提问模板,提出5个问题. 在每个问题后面,请说明哪一章节的什么内容引起了你的提问,提供一些上下文 列出一些事例或资料, ...

  7. HDU 2022 海选女主角

    http://acm.hdu.edu.cn/showproblem.php?pid=2022 Problem Description potato老师虽然很喜欢教书,但是迫于生活压力,不得不想办法在业 ...

  8. [buaa-SE-2017]个人作业-Week2

    个人作业-Week2 一.代码复审Checklist 1.概要部分 1.1 代码能符合需求和规格说明么? 本次作业的需求可以分成基本的功能实现和大规模数据下程序的健壮性,以及少量的异常处理能力,也就是 ...

  9. Internet History, Technology and Security (Week2)

    Week2. History: The First Internet - NSFNet coursera address Supercomputers Justify a National Netwo ...

  10. 陈爽 软件工程导论week2.1

    软件工程导论week2.1 第一章概论问题:1.程序=算法+数据结构  软件=程序+软件工程软件工程的目标是创造足够好的软件,可以从用户满意度,可靠性,软件流程的质量,可维护性等方面判断,但是我们没有 ...

随机推荐

  1. Winform或WebForm使用ReportViewer报表设计,工具栏按钮英文显示的解决办法

    在项目开发中,我们总是会用到rdlc报表设计器,大多数情况下在本地开发环境中工具栏按钮显示的是中文,但是部署到客户环境后发现显示的是英文. 解决这个问题也是走了很多弯路,给大家简单说一下: 1.最初以 ...

  2. SQL SERVER 错误捕捉与事务

    在SQL server (MSSQL)写代码中,不管是一段SQL代码,还是存储过程等,有的时候总会遇见程序报错,导致系统崩溃, 与C#同理,SQL SERVER 也提供了回滚与错误捕捉,事务比较复杂, ...

  3. SpringBoot 多环境切换

    日常开发中一般都会有三个不同的环境,分别是开发环境(dev),测试环境(test)和生产环境(prod),不同的环境各种配置都不相同,比如数据库配置,服务器端口等等. Spring Boot 多环境配 ...

  4. 【Azure Event Hub】自定义告警(Alert Rule)用来提示Event Hub的消息incoming(生产)与outgoing(消费)的异常情况

    问题描述 在使用Azure Service Bus的时候,我们可以根据Queue中目前存在的消息数来判断当前消息是否有积压的情况. 但是,在Event Hub中,因为所有消息都会被存留到预先设定的保留 ...

  5. GO网络编程(二)

    [[Go语言系列视频]老男孩带你21周搞定Go语言[全 242]] https://www.bilibili.com/video/BV1fD4y117Dg/?p=113&share_sourc ...

  6. Dubbo的高级特性:服务治理篇

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 上一篇中,我们已经在Spring Boot应用中集成了Dubbo,并注册了一个服务提供方和一个服务使用方 ...

  7. QOJ 6504. CCPC Final 2022 D Flower's Land 2题解

    QOJ 6504. CCPC Final 2022 D Flower's Land 2题解 题意简述 给你一个只含 \(0,1,2\) 的序列,相邻两个相同的数字可以直接消掉. 询问包含两种 区间所有 ...

  8. (占坑编辑中)hexo个人博客主页添加百度搜索资源平台

    hexo个人博客主页添加百度搜索资源平台 目的是在百度搜你的网站,可以搜到 配置过程 添加效果: 我的个人博客主页,欢迎访问 我的CSDN主页,欢迎访问 我的简书主页,欢迎访问 我的GitHub主页, ...

  9. ASP.NET 6 使用工作单元操作 MongoDB

    大家好,我是Edison. 最近工作中需要用到MongoDB的事务操作,因此参考了一些资料封装了一个小的组件,提供基础的CRUD Repository基类 和 UnitOfWork工作单元模式.今天, ...

  10. Lucene.Net  -全文检索引擎

    简介 Lucene.Net只是一个全文检索开发包,不是一个成型的搜索引擎,它的功能就是负责将文本数据按照某种分词算法进行切词,分词后的结果存储在索引库中,从索引库检索数据的速度灰常快 版本使用 3.0 ...