攻防世界-first

news/2024/5/14 17:51:47/文章来源:https://blog.csdn.net/weixin_61154173/article/details/129641628

题目下载:下载

IDA载入

__int64 __fastcall main(int a1, char **a2, char **a3)
{__useconds_t *v3; // rbpunsigned int v4; // eaxint *v5; // rcxint v6; // edxunsigned int v7; // eaxsigned __int64 v8; // rcx__int64 v9; // raxchar v10; // blchar v11; // dlvoid (**v12)(void *); // rbpchar *v13; // r12pthread_t *v14; // r13void (*v15)(void *); // rdiunsigned __int64 i; // rcxchar v17; // alint *v18; // rdxint v19; // esiunsigned int v20; // eaxunsigned __int64 v21; // rdxchar *v22; // raxchar *v23; // rdxchar v24; // div3 = useconds;v4 = time(0LL);srand(v4);do*v3++ = 100 * (rand() % 1000);while ( v3 != &unk_602208 );__isoc99_scanf("%63s", input);v5 = input;                                   // 输入的首地址给v5do{v6 = *v5++;v7 = ~v6 & (v6 - 16843009) & 0x80808080;}while ( !v7 );                                // v7等于0 就循环if ( (~v6 & (v6 - 16843009) & 32896) == 0 )v7 >>= 16;                                  // 右移16,相当于除以4if ( (~v6 & (v6 - 16843009) & 32896) == 0 )v5 = (v5 + 2);                              // v5应该是个地址v8 = v5 - (input + __CFADD__(v7, v7) + 3);    // __CFADD__函数的功能是返回两个参数相加后的CF标志位。v9 = 0LL;v10 = 0;while ( v8 != v9 )                            // 不相等就循环{v11 = *(input + v9) + v9;++v9;                                       // 累加,知道等于v9v10 ^= v11;}v12 = &newthread;                             // v12是地址v13 = 0LL;v14 = &newthread;                             // v14也是地址do{if ( pthread_create(v14, 0LL, start_routine, v13) )// 创建线程的函数,它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。{perror("pthread_create");exit(-1);}++v13;++v14;}while ( v13 != 6 );                           // v13==6,退出循环,所以pthread_create执行6次do{v15 = *v12++;pthread_join(v15, 0LL);                     // 主线程等待子线程的终止。}while ( &free != v12 );for ( i = 0LL; ; byte_60221F[i] = v10 ^ byte_6020DF[i] ^ v17 ){v18 = input;                                // v18是地址do{v19 = *v18++;                             // 把输入的值一个一个给v19v20 = ~v19 & (v19 - 16843009) & 0x80808080;}while ( !v20 );                             // v20不为0停止循环if ( (~v19 & (v19 - 16843009) & 32896) == 0 )v20 >>= 16;                               // v20右移if ( (~v19 & (v19 - 16843009) & 32896) == 0 )v18 = (v18 + 2);v21 = v18 - (input + __CFADD__(v20, v20) + 3);if ( v21 <= i )break;                                    // 终止for循环的唯一v17 = *(flag + i++);                        // v17遍历flag值}if ( v21 )                                    // v21不为0,进入条件1{if ( (LOBYTE(flag[0]) - 48) > 74u )         // 不走{
LABEL_32:puts("Badluck! There is no flag");return 0LL;}v22 = flag + 1;v23 = (v21 + 6300192);while ( v22 != v23 )                        // 不等 就循环{v24 = *v22++;                             // v24也是flag的值if ( (v24 - 48) > 74u )                   // 不走goto LABEL_32;}}__printf_chk(1LL, "Here is the flag:%s\n", flag);return 0LL;
}

代码很长,其实有用的挺少的,其他都是混淆代码。

开始代码:

首先进行输入一个input,然后有一个while循环涉及到input并且有个异或操作,所以可能挺重要的。

看下一段代码

 有一个pthread_create()函数:

pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。若成功,返回0;若出错,返回出错编号。

参数

第一个参数为指向线程标识符的指针。

第二个参数用来设置线程属性。

第三个参数是线程运行函数的起始地址。

最后一个参数是运行函数的参数。

v13等于6时停止循环,所以这个循环创建了6个线程。跟进线程运行函数的起始地址start_routine

补充一下:pthread_mutex_lock 

pthread_mutex_lock: 是一个 POSIX 线程库中的函数,用于对互斥量进行加锁。该函数的作用是阻塞当前线程,直到该互斥量被解锁。一旦互斥量被加锁,其他线程将无法再次对其进行加锁。


互斥锁:对共享数据进行锁定,保证同一时刻只能有一个线程去操作。互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程需要等待,等互斥锁使用完释放后,其它等待的线程再去抢这个锁,是无序的。

既然有6个线程,所以他们会一起去抢互斥锁并上锁对数据资源进行操作。那么哪个线程先抢到互斥锁呢,这里有个usleep函数,让不同线程挂起不同时间,所以这个对哪个线程抢到资源起决定性作用,抢到互斥锁之后上锁,因为有6个线程,所以用户输入分成6组,每组4个进行md5加密。然后和byte_602120比较,如果和对应的相等就执行 flag[v6] = input[v4]赋值给flag数组。

根据v8[0] == byte_602120[v1]条件可以求出input:

import hashlib
check="4746bbbd02bb590fbeac2821ece8fc5cad749265ca7503ef4386b38fc12c4227b03ecc45a7ec2da7be3c5ffe121734e8"
for i in range(6):for j in range(32,127):for m in range(32,127):for n in range(32,127):for k in range(32,127):temp=chr(j)+chr(m)+chr(n)+chr(k)crypto=hashlib.md5(temp.encode()).hexdigest()if crypto[0:16]==check[i*16:i*16+16]:print(i,temp)
#juhuhfenlapsiuerhjifdunu

但是由于usleep存在你不知道是哪个线程先抢到互斥锁,所以你不知道哪个input部分赋值给flag数组。这里应该可以动态调试出来flag数组,或者24种可能自己排列组合...结果是juhuhfenlapsdunuhjifiuer

然后再根据

 解出byte_60221F[i]数组就好(这个数组和要求flag一致,如下图)

input1='juhuhfenlapsiuerhjifdunu'
check=[0xfe,0xe9,0xf4,0xe2,0xf1,0xfa,0xf4,0xe4,0xf0,0xe7,0xe4,0xe5,0xe3,0xf2,0xf5,0xef,0xe8,0xff,0xf6,0xf4,0xfd,0xb4,0xa5,0xb2]
i=0
v10=0
while(i!=len(input1)):v11=ord(input1[i])+iv10=v10^v11i=i+1input2='juhuhfenlapsdunuhjifiuer'
flag=''
for i in range(len(input2)):temp=ord(input2[i])^v10^check[i]flag+=chr(temp)
print(flag)#goodjobyougetthisflag233

相关函数补充:

pthread_mutex_init()函数          功能:初始化一个互斥锁

pthread_mutex_destroy()函数   功能:销毁一个互斥锁

pthread_mutex_lock()函数        功能:加锁

pthread_mutex_trylock()函数    功能:尝试加锁

pthread_mutex_unlock()函数    功能:解锁

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为知笔记私有化部署

前言 原来一直买的为知笔记vip&#xff0c;但是随着内容越来越&#xff0c;并且不好整理。同时还不能一键全部导出&#xff0c;最后决定将数据迁移到自己服务器上。为止笔记提供了docker镜像&#xff0c;这也方便了部署&#xff08;其实吧&#xff0c;从产品层面&#xff0c;可…

C++ Lambda表达式的常见用法

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

【Django 网页Web开发】05. 数据库操作,实战用户管理(保姆级图文)

目录1. 安装第三方模块2. ORM2.1 自己手动创建数据库2.2 django连接数据库2.3 建表语句写在哪里&#xff1f;2.4 建表语句写好后如何运行生效&#xff1f;3. 操作表3.1 创建数据表3.2 修改数据表4. 操作数据4.1 插入数据4.2 删除数据4.3 修改数据4.4 查询数据5. 实战&#xff1…

pytest学习和使用22-allure特性 丨总览中的Environment、Categories设置以及Flaky test使用

22-allure特性 丨总览中的Environment和Categories设置1 Environment设置1.1 设置方法1.2 创建文件2 Categories设置2.1 设置方式2.2 创建文件3 关于Flaky test3.1 Flaky test介绍3.2 产生Flaky Tests的原因3.3 Flaky安装3.4 Flaky使用3.5 小结小结1小结2如下图&#xff0c;我们…

开始学习HTML5

HTML5 简介 HTML5是HTML最新的修订版本&#xff0c;2014年10月由万维网联盟&#xff08;W3C&#xff09;完成标准制定。 HTML5的设计目的是为了在移动设备上支持多媒体。 HTML5简单易学。 什么是 HTML5? HTML5 是下一代 HTML 标准。 HTML , HTML 4.01的上一个版本诞生于 1…

如何将3张图片横向拼在一起

如何将3张图片横向拼在一起&#xff1f;遇到这个情况你可能马上就会说出很多图片处理的app&#xff0c;比如用某秀秀来操作&#xff0c;但是也有很多时候某秀秀也处理不了的。当我们的图片非常大&#xff0c;图片数量很多&#xff0c;图片的格式不是jpg那种通用的格式&#xff…

如何监控和诊断JVM堆内和堆外内存使用?

第26讲 | 如何监控和诊断JVM堆内和堆外内存使用&#xff1f; 上一讲我介绍了 JVM 内存区域的划分&#xff0c;总结了相关的一些概念&#xff0c;今天我将结合 JVM 参数、工具等方面&#xff0c;进一步分析 JVM 内存结构&#xff0c;包括外部资料相对较少的堆外部分。 今天我要…

Java栈和队列·下

Java栈和队列下2. 队列(Queue)2.1 概念2.2 实现2.3 相似方法的区别2.4 循环队列3. 双端队列 (Deque)3.1 概念4.java中的栈和队列5. 栈和队列面试题大家好&#xff0c;我是晓星航。今天为大家带来的是 Java栈和队列下 的讲解&#xff01;&#x1f600; 继上一个讲完的栈后&…

视听场景理解经典任务

文章目录1. 视听场景理解简介2. 主要任务2.1 Audio-visual Event Localization (AVE) 2.2 Audio-visual Video Parsing &#xff08;AVVP&#xff09;2.3 Audio-visual Question Answering &#xff08;AVQA&#xff09;2.4 Audio-visual Segmentation &#xff08;AVS&#xf…

STM32中systick中断的优先级

1、systick中断的优先级 systick为内核外设中断&#xff0c;与普通外设中断的优先级有些区别&#xff0c;并没有抢占优先级和子优先级的说法。 对于M3来说内核外设的中断优先级由内核SCB这个外设的寄存器&#xff1a;SHPRx&#xff08;x1.2.3&#xff09;来配置。 内核外设的中…

佳明安夺(Garmin Enduro)续航简单测试

文章目录&#xff08;一&#xff09;结论&#xff08;二&#xff09;测试条件&#xff08;2.1&#xff09;Garmin Connect APP 日历&#xff08;2.2&#xff09;具体运动记录&#xff08;2.3&#xff09;步数情况&#xff08;三&#xff09;补充和探讨&#xff08;3.1&#xff…

信捷PLC通过EtherCat与松下伺服通讯时的断电重启时会产生巨大异响的Bug原因及解决办法

信捷PLC支持ethercat通讯协议,可以和支持ethercat的从站通讯,像伺服驱动器或IO站点等。 其中,信捷XLH系列PLC在与松下伺服驱动器通讯时,有一个比较严重的问题,就是PLC断电再上电时,有时候会出现bug,这个bug的现象是,使用PLC的指令方式去控制伺服轴动作时,会产生巨大的…

kali内置超好用的代理工具proxychains

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…

Mybatis的课程总结

1.mybatis Mybatis主要是对代码进行少写&#xff0c;分别加入核心配置文件和mapper映射文件&#xff0c; 核心配置文件主要是为了连接数据库&#xff0c;mapper映射文件是为了编写sql语句 1.如何配置mybatis ①先创建一个moudle ②然后配置jar包 ③然后进行mybatis的分层 bean…

pcb成型板aoi检测,6种PCB板常用的检测方法

6种PCB板常用的检测方法&#xff0c;主要包括&#xff1a;PCB板人工目测、PCB板在线测试、PCB板功能测试、自动光学检测、自动X光检查、激光检测系统1、PCB板人工目测使用放大镜或校准的显微镜&#xff0c;利用操作人员视觉检查来确定电路板合不合格&#xff0c;并确定什么时候…

我们再次看看 ARB 女巫空投策略,做到知彼知己,不敢说百战不殆

女巫检测选项该项目旨在从 Arbitrum 空投中删除 Sybil 地址&#xff0c;确保只有合法用户才能收到空投代币。方法我们使用链上数据来识别同一用户拥有的相关地址&#xff0c;并使用来自 Nansen、Hop 和 OffChain Labs 的数据删除实体地址&#xff0c;例如网桥、交易所和智能合约…

Verilog学习之触发器与modelsim仿真

目录 一、前言 二、触发器介绍 三、测试文件代码 一、前言 ​ ​本文将学习常见类型触发的verilog编写&#xff0c;结合仿真结果来熟悉。 二、触发器介绍 ​ ​触发器在verilog中的作用主要是具有存储作用&#xff0c;由时钟信号来触发改变存储内容&#xff0c;较常见…

银河麒麟v10系统硬盘挂载

一、查看磁盘 近期由于centos系统停止更新用户服务器要更换银河麒麟v10&#xff0c;拿到服务器后使用lsblk -f或fdisk -l命令查看磁盘名称 可以看到sdb200G就是要挂载的硬盘&#xff0c;还没有uuid需要初始化才可以挂载。 二、分区 分区命令&#xff1a; fdisk /dev/【你的…

【LeetCode每日一题】——面试题17.21.直方图的水量

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【时间频度】八【代码实现】九【提交结果】一【题目类别】 双指针 二【题目难度】 困难 三【题目编号】 面试题17.21.直方图的水量 四【题目描述】 给定一个直方图(也称…

Java解题--练习解题阶段(无序阶段)-ALGO-1006 拿金币

题目算法训练 拿金币资源限制内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s问题描述有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以…