攻防世界题目练习——Reverse新手+引导模式

news2024/11/19 22:35:49

题目目录

    • 1. 666
    • 2.Reversing-x64Elf-100
    • 3. easyRE1
    • 4. insanity
    • 5. open-source
    • 6. game
    • 7. Hello, CTF
    • 8. re1

1. 666

下载附件
用IDA Pro打开文件,直接看到main入口,反编译查看代码如下:
注:strcmp(a,b)函数当a=b时返回值为0。

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s[240]; // [rsp+0h] [rbp-1E0h] BYREF
  char v5[240]; // [rsp+F0h] [rbp-F0h] BYREF

  memset(s, 0, 0x1EuLL);
  printf("Please Input Key: ");
  __isoc99_scanf("%s", v5);
  encode(v5, (__int64)s);
  if ( strlen(v5) == key )
  {
    if ( !strcmp(s, enflag) )
      puts("You are Right");
    else
      puts("flag{This_1s_f4cker_flag}");
  }
  return 0;
}

可以看到,输入的“Key”作为v5字符串传入encode()函数中,然后将v5的长度与key比较,再比较字符串senflag,查看key和enflag的值:
在这里插入图片描述
我们点击进入函数encode()查看函数内容如下:

int __fastcall encode(const char *a1, __int64 a2)
{
  char v3[104]; // [rsp+10h] [rbp-70h]
  int v4; // [rsp+78h] [rbp-8h]
  int i; // [rsp+7Ch] [rbp-4h]

  i = 0;
  v4 = 0;
  if ( strlen(a1) != key )
    return puts("Your Length is Wrong");
  for ( i = 0; i < key; i += 3 )
  {
    v3[i + 64] = key ^ (a1[i] + 6);
    v3[i + 33] = (a1[i + 1] - 6) ^ key;
    v3[i + 2] = a1[i + 2] ^ 6 ^ key;
    *(_BYTE *)(a2 + i) = v3[i + 64];
    *(_BYTE *)(a2 + i + 1LL) = v3[i + 33];
    *(_BYTE *)(a2 + i + 2LL) = v3[i + 2];
  }
  return a2;
}

可以看到第一段代码中的调用encode(v5,s),v5,s相当于下面encode函数代码中的a1,a2。
可以看到首先比较字符串a1的长度是否==key,然后将a1的每3个字节的值为一组,分别+ - ^6,并和key进行异或操作,再将值赋值给a2对应位置的3个字节,最后返回a2的值。
因此encode(v5,s)就是将v5的值进行加密操作后得到s。
然后将s的值与enflag的值比较,相等即可。
因此我们写一个反向解密的脚本,将原来的加密操作反过来执行:

python:

#python脚本在将字符和整型进行操作时,没有办法直接转换,要自己进行字符类型转换
#s=enflag="izwhroz\"\"w\"v.K\".Ni"
s = ''
enflag = 'izwhroz""w"v.K".Ni'
key = 18
# 12h=16*1+2=18
for i in range(0, key, 3):
    s += chr((ord(enflag[i]) ^ key) - 6)
    s += chr((ord(enflag[i + 1]) ^ key) + 6)
    s += chr((ord(enflag[i + 2]) ^ key) ^ 6)

print(s)
#unctf{b66_6b6_66b}

C:

#include <stdio.h>

int main(){
    char s[20]={ };
    char enflag[]= "izwhroz\"\"w\"v.K\".Ni";
    int key=18;

    for(int i=0;i<key;i+=3){
        s[i] = (enflag[i] ^ key) - 6;
        s[i + 1] = (enflag[i + 1] ^ key) + 6;
        s[i + 2] = (enflag[i + 2] ^ key) ^ 6;
    }

    printf("%s",s);
}
//unctf{b66_6b6_66b}

2.Reversing-x64Elf-100

下载附件
找到入口函数main:
可以看到对输入的password用一个函数进行了操作:
在这里插入图片描述
我们进入这个函数查看,可以看到,需要函数返回0,即如下条件成立:

*(char *)(v3[i % 3] + 2 * (i / 3)) - *(char *)(i + a1) == 1

在这里插入图片描述
也就是 (a1+i)=(v3[i%3]+2*(i/3))-1
故脚本如下:

v = ["Dufhbmf", "pG`imos", "ewUglpt"]
a = ""
for i in range(12):
    a += chr(ord(v[i % 3][2 * (i // 3)]) - 1)

print(a)
#输出:
#Code_Talkers

真的是被报错折磨半天,一直报错各种类型之类的问题,一开始一直以为是把v3[0]这种整个字符串变成int类型的值然后加上2*(i/3),后来看了解析终于发现,(char *)(v3[i % 3] + 2 * (i / 3)),v3[i%3]只是一个地址,后面加上2*(i/3)是将指针后移,前面有个char*指针,也就是说v3[i % 3] + 2 * (i / 3)是个地址。
可恶,太久没接触写代码,一直接触python脚本,已经忘了C语言了。

3. easyRE1

在这里插入图片描述
直接出现flag,给字符串加上flag{}。

4. insanity

在这里插入图片描述
进入查看strs数组:
在这里插入图片描述

5. open-source

源代码如下:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 4) {
    	printf("what?\n");
    	exit(1);
    }
//需要4个参数,其中第一个参数为文件名
    unsigned int first = atoi(argv[1]);
    if (first != 0xcafe) {
    	printf("you are wrong, sorry.\n");
    	exit(2);
    }
//第二个参数为0xcafe转整型51966
    unsigned int second = atoi(argv[2]);
    if (second % 5 == 3 || second % 17 != 8) {
    	printf("ha, you won't get it!\n");
    	exit(3);
    }
//要求argv[2]%17==8且argv[2]%5!=3,则argv[2]取25
    if (strcmp("h4cky0u", argv[3])) {
    	printf("so close, dude!\n");
    	exit(4);
    }
//要求argv[3]="h4cky0u"
    printf("Brr wrrr grr\n");

    unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
//计算hash=51966*31337+8*11+7-1615810207=12648430
    printf("Get your key: ");
    printf("%x\n", hash);
//转成16进制:c0ffee
    return 0;
}

6. game

题目:
在这里插入图片描述
就和原神解谜一样让8行全部亮起来就行,本人就当作游戏纯手工试出来的(乖巧.jpg)
在这里插入图片描述
也可以IDA打开后改源码:
在这里插入图片描述
将判断条件后面5个都改成!=1,然后在控制台输入2,就可以获得flag。

7. Hello, CTF

main函数如下:
在这里插入图片描述
如图,首先将字符串"437261636b4d654a757374466f7246756e"复制给v3,接下来v10被初始化为0。输入的内容作为v9,判断v9的长度>0x11则结束循环退出,因此要求输入内容长度<=0x11,也就是<=17。
然后接下来的for循环将v9的值赋值给v4,遇到空字符则退出,然后将v4的值以16进制形式写入Buffer中,再将Buffer接到v10后面,而由于v10初始化为全0,故V10的内容就是Buffer的内容。
随即比较v10与v13的值,相等则输出"Success"。也就是需要v10=“437261636b4d654a757374466f7246756e”,可以进行ASCII码转换得到flag:“CrackMeJustForFun”

8. re1

先打开文件逆向查看,前面又很多printf语句不知道打印了什么,最后的if语句输出两个字符串,不知道哪一个才是成功获得flag的反馈,于是直接运行exe程序查看如下:
在这里插入图片描述
因此猜测if语句的v3!=0时是flag错误的提示,也就是v3=0时,v7==v5.m128i_i8时获得flag,因此需要知道v5.m128i_i8的内容。
在这里插入图片描述
查看v5的结构如下:
_m128i是一个union联合类型,再看上面源码中,v5是将xmmword_413E34转换为_m128i类型的结构,因此我们取xmmword_413E34即为flag。
在这里插入图片描述
看到xmmword_413E34内容如下,数据类型为16进制,因此对其进行ASCII码转换得到flag。
要注意字节是从低到高位,转成ASCII码的排列顺序应为:
4455544354467B57653163306D657430
4455544354467D
在这里插入图片描述
一直以为源码中比较字符串时v5.m128i_i8只有16字节所以只比较16字节,没想到后面qword_413E44和前面xmmword是跟在后面一起的QAQ。没搞懂,还是说v5.m128i_i8只是一个地址,后面字符串全都算是一整个字符串。
看了别人的博客知道还可以用快捷键A或者右键把这串16进制直接转换成ASCII码:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1046483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习|如何确定 CUDA+PyTorch 版本

对于深度学习初学者来说&#xff0c;配置深度学习的环境可能是一大难题&#xff0c;因此本文主要讲解CUDA; cuDNN; Pytorch 三者是什么&#xff0c;以及他们之间的依赖关系。 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计…

【CMU15-445 Part-12】Query Execution I

Part12-Query Execution I Processing Models Processing Model主要指的是明确如何去执行一个查询计划&#xff08;top 2 bottom or bottom 2 top,operator之间的传递&#xff09;。 Iterator Model (volcano model/pipeline model);每个算子实现一个Next( )&#xff0c;父…

Matlab中clear,close all,clc功能详细说明

背景&#xff1a; 我们在写matlab程序时&#xff0c;首行总是先敲入&#xff1a;clear; close all; clc;&#xff0c;但你真的知道这三句话的具体作用嘛&#xff0c;下面进行详细说明和演示。 一、clear的功能 clear的功能&#xff1a;清理工作区变量&#xff0c;不清理前是…

每日一练 | 华为认证真题练习Day115

1、FEC(Forwarding Equivalence Class)转发等价类&#xff0c;是一组具有某些共性的数据流的集合&#xff1b;FEC可以根据地址进行划分&#xff0c;但是不能根据业务类型、QoS等要素进行划分。 A. 对 B. 错 2、关于OSI参考模型中网络层的功能说法正确的是&#xff1f; A. OS…

Linux部署elk日志监控系统

目录 一、简介 二、部署elasticsearch 2.1 安装jdk11&#xff08;jdk版本>11&#xff09; 2.2 下载安装包 2.3 授权elk用户 2.4 配置elasticsearch.yml 2.5 启动elasticsearch 三、部署logstash 3.1 启动测试 3.2 可能出现的报错 3.3 指定配置文件启动logstash 3.4 安装El…

【基于Qt和OpenCV的多线程图像识别应用】

基于Qt和OpenCV的多线程图像识别应用 前言多线程编程为什么需要多线程Qt如何实现多线程线程间通信 图像识别项目代码项目结构各部分代码 项目演示小结 前言 这是一个简单的小项目&#xff0c;使用Qt和OpenCV构建的多线程图像识别应用程序&#xff0c;旨在识别图像中的人脸并将…

作为产品经理,你是如何分析和管理你的产品需求的?

作为一名产品经理&#xff0c;分析和管理产品需求是非常重要的工作。在产品开发周期中&#xff0c;需求调研、需求分析、需求管理等环节都是非常关键的&#xff0c;因为好的需求管理能够直接影响产品的质量和用户体验。 需求调研 在进行需求调研的过程中&#xff0c;我们首先…

App开发者如何从立项着手,奠定商业化基础,完成0到1转变?

随着移动互联技术的发展&#xff0c;流量即价值的观念深入人心&#xff0c;大量不同细分领域的移动应用进入市场。根据工信部公布数据&#xff0c;2023年上半年&#xff0c;我国国内市场上监测到活跃的APP数量为260万款&#xff08;包括安卓和苹果商店&#xff09;&#xff0c;…

Visual Studio 如何删除多余的空行,仅保留一行空行

1.CtrlH 打开替换窗口&#xff08;注意选择合适的查找范围&#xff09; VS2010: VS2017、VS2022: 2.复制下面正则表达式到上面的选择窗口&#xff1a; VS2010: ^(\s*)$\n\n VS2017: ^(\s*)$\n\n VS2022:^(\s*)$\n 3.下面的替换窗口皆写入 \n VS2010: \n VS2017: \n VS2022: \n …

铁路用热轧钢轨

声明 本文是学习GB-T 2585-2021 铁路用热轧钢轨. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了铁路用钢轨的订货内容、分类、尺寸、外形、质量及允许偏差、技术要求、试验方法、检 验规则、标志及质量证明书。 本标准适用于3…

react import爆红

如上所示&#xff0c;会标红&#xff0c; 解决办法&#xff1a;在vscode内部SHiftCtrlP 输入Reload window, 如上的第一个&#xff0c;选中后回车&#xff0c;标红就没了&#xff0c;非常好用。

版本控制系统:Perforce Helix Core -2023

Perforce Helix Core是领先的版本控制系统&#xff0c;适用于需要加速大规模创新的团队。存储并跟踪您所有数字资产的更改&#xff0c;从源代码到二进制再到IP。连接您的团队&#xff0c;让他们更快地行动&#xff0c;更好地构建。 通过 Perforce 版本控制加速创新 Perforce H…

史上最严重的10起勒索软件攻击

与今天的勒索软件攻击相比&#xff0c;世界上首起勒索软件攻击简直就是小菜一碟。 1989年&#xff0c;出席世界卫生组织&#xff08;WHO&#xff09;艾滋病会议的数千名与会者回到家中&#xff0c;结果在自家的邮箱软盘里发现了一份关于感染艾滋病毒可能性的调查问卷&#xff…

手机能搜到某个wifi,电脑搜不到解决方法(也许有用)

方法一&#xff1a;更新驱动 下载驱动大师、驱动精灵等等驱动软件&#xff0c;更新网卡驱动 方法二 按 win 键&#xff0c;打开菜单 搜索 查看网络连接&#xff08;win11版本是搜这个名字&#xff09; 点击打开是这样式的 然后对 WLAN右击->属性->配置->高级 这…

等保二级测评国家收费标准是多少?统一的吗?

目前我国等保分为五个级别&#xff0c;不同级别要求和费用也不同。有小伙伴在问&#xff0c;等保二级测评国家收费标准是多少&#xff1f;统一的吗&#xff1f;这里就来给大家简单回答一下&#xff0c;仅供参考&#xff01; 等保二级测评国家收费标准是多少&#xff1f;统一的吗…

RabbitMQ消息可靠性保证机制--发送端确认

发送端确认机制 ​ RabbitMQ后来引入了一种轻量级的方式&#xff0c;叫发送方确认(publisher confirm)机制&#xff0c;生产者将信息设置成confirm&#xff08;确认&#xff09;模式&#xff0c;一旦信道进入了confirm模式&#xff0c;所有在该信道上面发送的消息都会被指派成…

python使用uiautomator2操作真机

测试环境&#xff1a;win10 64位&#xff0c;python3.10.4&#xff1b;真机&#xff0c;荣耀10青春版&#xff0c;Android版本10。 之前是在手机模拟器上操作的&#xff0c;参考我的文章python使用uiautomator2操作雷电模拟器_小小爬虾的博客-CSDN博客 一、将手机设置为开发者…

任务执行大数据量与高并发方案

大数据量高并发任务解决方案 场景 每个任务有十万条以上的数据&#xff0c;任务执行过程中对这些数据逐条做分析处理。 在同一段时间&#xff0c;会出现任务高并发执行&#xff0c;导致内存溢出 解决方案 1、分批处理 任务执行过程中&#xff0c;不一次性读取全量数据&…

将切分的图片筛选出有缺陷的

将切分的图片筛选出有缺陷的 需求代码 需求 由于之前切分的图像有一些存在没有缺陷&#xff0c;需要再次筛选 将可视化的图像更改后缀 更改为xml的 可视化代码 可视化后只有7000多个图像 原本的图像有1W多张 代码 # 按照xml文件删除对应的图片 # coding: utf-8 from P…

Java比较器之equals、comparable、comparator

文章目录 前言一、基本类型比较1.2.equals3.和equals的区别 二、对象的比较1.覆写基类的equals2.基于Comparable接口类的比较3.基于Comparator比较器比较4.三种方式对比 前言 在Java中&#xff0c;基本类型的对象可以直接比较&#xff0c;而自定义类型&#xff0c;默认是用equ…