攻防世界-first

news/2025/3/14 21:39:19/

题目下载:下载

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.ppmy.cn/news/33693.html

相关文章

自动标注工具 Autolabelimg

原理简介~~ 对于数据量较大的数据集&#xff0c;先对其中一部分图片打标签&#xff0c;Autolabelimg利用已标注好的图片进行训练&#xff0c;并利用训练得到的权重对其余数据进行自动标注&#xff0c;然后保存为xml文件。 一、下载yolov5v6.1 https://github.com/ultralytic…

织梦dedecms程序安全设置

升级到dedecms最新版本 dedecms后台一般支持在线升级&#xff0c;如果不行&#xff0c;请到官方网站查询手工升级办法www.dedecms.com 权限设置&#xff1a; 主机控制面板中点击 “文件管理” 选中wwwroot目录 在点击 “权限” 按钮&#xff0c;将整站所有文件设置为只读。 老…

HNUCM省赛训练赛第14场题解

这边是这次训练赛的地址&#xff0c;都是中文题了这次。 目录A——TicketB——GCDC——FunctionG——CircleH——ClockI——TangramJ——TetrisA——Ticket 水题一道&#xff0c;没什么好讲的&#xff0c;但是我们wa了一发&#xff0c;题目没给清楚&#xff0c;实际上我们需要的…

ChatGPT-4.0 : 未来已来,你来不来

文章目录前言ChatGPT 3.5 介绍ChatGPT 4.0 介绍ChatGPT -4出逃计划&#xff01;我们应如何看待ChatGPT前言 好久没有更新过技术文章了&#xff0c;这个周末听说了一个非常火的技术ChatGPT 4.0&#xff0c;于是在闲暇之余我也进行了测试&#xff0c;今天这篇文章就给大家介绍一…

智慧灌区管理平台-大中型灌区信息化监测系统

智慧灌区管理平台平台概述柳林智慧灌区管理平台以物理灌区为单元、时空数据为底座、数学模型为核心、水利知识为驱动&#xff0c;对物理灌区全要素和建设运行全过程进行数字映射、智能模拟、前瞻预演&#xff0c;与物理灌区同步仿真运行、虚实交互、迭代优化&#xff0c;实现对…

前端如何丢掉你的饭碗?

对于后端而言&#xff0c;我们常有“删库跑路”的说法&#xff0c;这说明后端的操作对于信息系统而言通常影响很大&#xff0c;可以轻易使信息系统宕机、崩溃&#xff0c;直接导致项目失败。所以&#xff0c;不要去逼后端程序员&#xff01; 作为前端程序员&#xff0c;我们似…

从零实现深度学习框架——学习率调整策略介绍

引言 本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。 要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实现我…

【Spring事物三千问】Spring配置多数据源 vs 给多个数据源添加事物管理

在 Spring 中配置多数据源 与 给多个数据源添加事物管理是有区别的。 如果只需要使用到多个数据源&#xff0c;而不需要进行事物管理&#xff0c;是可以进行简单处理的。 Spring 中配置多数据源 如果不需要对数据源进行事物管理的话&#xff0c;在 Spring 中配置多个数据源是…