攻防世界安卓刷题笔记(新手模式)1-4
1.基础android

进入后是这样的页面。查看源代码看看。首先要注意这个软件并没有加壳,所以我们可以直接着手分析。搜索错误提示“Failed”定位到关键代码,看样子就是检验输入的内容

注意到这里有一行关键代码,cond_39对应的正是failed那个地方,我们直接采用修改跳转条件的方法,看看会不会直接提示出flag。

进去是进去了,结果还有第二关,看样子貌似和图片隐写相关?这里先存疑,继续分析代码 。这里并没有错误提示,不太好直接定位。那么我们就从图片入手,看看图片本身是否存在问题。
并没有直接找到图片,而是找到了一个压缩包。怀疑压缩包内部有猫腻,但是解压失败,利用winhex分析文件头,可知这其实是一个jpg文件。用电脑打开后就是flag。软件故意让图片显示不完全,因为flag其实被用文字的方式放在原图女士裙子上,如下图所示


2. android2.0

老办法定位到了关键代码, 看来关键就是在type!本来在上面看到一个pwd的资源id挺开心的,结果发现原来这只是代表输入框,那么思路还需要改变一下,如何改变呢?
其实,只要输入的内容符合great的要求,就会提示great,因此我们要找到特定的算法

看看这个就像是函数的东西干了什么事

问了AI,意思是调用了一个so文件。so文件在IDA里面打开就行了,锁定到一个JAVA开头的函数,反编译得到:

看样子v4就是目标字符串 。查看WP,这是一种分组加密。(原谅我逆向功底差,只能看wp)
下面代码估计是分组的实现,由%3推测是分了3组,v5一直在加一,应该是实现索引的。

第一组的关键代码

注意这里传的参数是指针,也就是v5这个字符串已经变成加密后的了。这个会影响第二组的操作。
根据算法,要让a1==那个字符串。a1就是经过异或后的v5,反向操作以下就行。简单编写python得到:
a='LN^d'
b=''
i=0
#原c++循环在4终止 等于说剩下一个l没有异或
while(i<4):b+=(chr(int((ord(a[i])^128)/2)))i+=1
print(b+'l')
得到结果fgorl
第二组:

a5就是图示的byte_2888!
首先双击a5,选中a5的所有元素,点击shift+e导出。然后继续在python里面写exp!
a=[32, 53, 45, 22, 97]
b='LN^dl'
for i in range(0,4):a[i]=a[i]^ord(b[i])print(chr(a[i]),end='')
print(chr(a[4]))
得到l{sra。
V7则和第二组一样的解密思路。结果是asoy}
第三组解题代码如下:
#只需要前四组就好
a=[32, 53, 45, 22]
b='AFBo'
c=''
for i in range(0,4):c+=chr(a[i]^ord(b[i]))
print(c)
三组字符进行栅栏解密就好啦/

3.APK逆向
这道题很直白,而且进去就让输入flag。我们直接用MT管理器打开看。这道题并没有加固,所以可以直接分析dex文件。
在arsc搜索错误提示,定位到代码位置。

改一个这里的代码看看会不会扭转提示。提示确实变了,但是没有弹出来flag,转变思路
//
// Decompiled by Jadx - 562ms
//
package com.example.crackme;import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Button;
import android.widget.EditText;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MainActivity extends Activity {private Button btn_register;private EditText edit_sn;String edit_userName;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(0x7f040019);setTitle(0x7f06001d);this.edit_userName = "Tenshine";this.edit_sn = (EditText) findViewById(0x7f0c0051);this.btn_register = (Button) findViewById(0x7f0c0052);this.btn_register.setOnClickListener(new MainActivity$1(this));}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(0x7f0d0000, menu);return true;}public boolean checkSN(String userName, String sn) {if (userName == null) {return false;}try {if (userName.length() == 0 || sn == null || sn.length() != 22) {return false;}MessageDigest digest = MessageDigest.getInstance("MD5");digest.reset();digest.update(userName.getBytes());byte[] bytes = digest.digest();String hexstr = toHexString(bytes, "");StringBuilder sb = new StringBuilder();for (int i = 0; i < hexstr.length(); i += 2) {sb.append(hexstr.charAt(i));}String userSN = sb.toString();return new StringBuilder().append("flag{").append(userSN).append("}").toString().equalsIgnoreCase(sn);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return false;}}private static String toHexString(byte[] bytes, String separator) {StringBuilder hexString = new StringBuilder();for (byte b : bytes) {String hex = Integer.toHexString(b & 255);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex).append(separator);}return hexString.toString();}
}
但是浏览到MAINactivity,确实发现了关键代码,看起来就是MD5加密。分析代码查看。

注意看这一块代码,首先对指定的消息md5加密,而后通过循环,每2次循环就取出一个数,当作flag。用PY的切片秒了

4.人民的名义:抓捕赵德汉
点进去,映入眼帘的就是一个main函数。

大致意思就是获取用户输入的字符串,然后调用checkPassword方法进行检查,如果正确就是提示正确,否则让你检查。
定位到checkPassword方法。

看一下boolean方法,结尾是返回hashbytes是否等于后面的那一串(怀疑是MD5加密后的结果),大胆猜测是先对输入的数据进行md5摘要计算,然后再进行下面方法的计算,最后看计算的结果是否等于给定的数值
(错误做法!!!)

询问豆包验证了自己的猜想,那么接下来就是分析如何实现的算法。

首先定义了一个循环,循环内首先求解出halfbyte,然后看do...while。这个do...while只会进行两次,因为第一次,计数器i会被two_halfs计算为0,而后第二次i就会变成1,不满足条件,终止循环。在这个循环之中,根据half byte的不同规则,添加进了最终的数组。
要想倒回去,就要逆向分析。原代码的forxunhuanl多少次?每循环一次for,do..while进行两次,也就是添加两个数进结果。结果的十六进制一共是32位,因此for循环进行16次。下面根据for循环来写出解题代码:
解出来有负数?
正确思路

其实下面的方法的用处不是对md5进行复杂的操作,而是把字节数组转为十六进制。我也是参考了wp才发现这一个问题!所以直接对md5进行解密就可以了。
相关文章:
攻防世界安卓刷题笔记(新手模式)1-4
1.基础android 进入后是这样的页面。查看源代码看看。首先要注意这个软件并没有加壳,所以我们可以直接着手分析。搜索错误提示“Failed”定位到关键代码,看样子就是检验输入的内容 注意到这里有一行关键代码,cond_39对应的正是failed那个地方…...
发现一个对话框中的按钮,全部失效,点击都没有任何反应,已经解决
前端问题,技术vue2,ts。 发现一个对话框中的按钮,全部失效,点击都没有任何反应。 因为我只在template标签中加入下面这个代码,并没有注册。 只要有一个子组件没有注册,就会影响所有的按钮,使当前…...
MyBatisPlus实现多表查询
在MyBatisPlus中实现多表查询,主要有以下几种方法: 使用注解进行多表查询: 你可以在Mapper接口中使用Select注解来编写SQL查询语句,实现多表查询。例如,如果你想根据用户ID查询用户信息和对应的区域名称,可…...
机器学习详解(5):MLP代码详解之MNIST手写数字识别
文章目录 1 MNIST数据集2 代码详解2.1 导入库和GPU2.2 MNIST数据集处理2.2.1 下载和导入2.2.2 张量(Tensors)2.2.3 准备训练数据 2.3 创建模型2.3.1 图像展开2.3.2 输入层2.3.3 隐藏层2.3.4 输出层2.3.5 模型编译 2.4 训练模型2.4.1 损失函数与优化器2.4.2 计算准确率2.4.3 训练…...
如何在vue中实现父子通信
1.需要用到的组件 父组件 <template><div id"app"><BaseCount :count"count" changeCount"cahngeCount"></BaseCount></div> </template><script> import BaseCount from ./components/BaseCount.v…...
PHP实现华为OBS存储
一:华为OBS存储文档地址 官方文档:https://support.huaweicloud.com/obs/index.html github地址:https://github.com/huaweicloud/huaweicloud-sdk-php-obs 二:安装华为OBS拓展 composer require obs/esdk-obs-php 三&#x…...
嵌入式 linux Git常用命令 抽补丁 打补丁
Git常用命令 为什么要学习git呢?我相信刚入门的小伙伴敲打肯定碰到过这种玄学问题,我明明刚刚还能用的代码,后面不知道咋的就不能用了,所以每次你调出一个功能点以后都会手动复制一份代码防止出问题,时间一长发现整个…...
Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值
MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB,我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上,包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户,…...
【学习笔记】目前市面中手持激光雷达设备及参数汇总
手持激光雷达设备介绍 手持激光雷达设备是一种利用激光时间飞行原理来测量物体距离并构建三维模型的便携式高科技产品。它通过发射激光束并分析反射回来的激光信号,能够精确地获取物体的三维结构信息。这种设备以其高精度、适应各种光照环境的能力和便携性…...
Burp与小程序梦中情缘
前言 在日常渗透工作中,有时需要对微信小程序进行抓包渗透,通过抓包,我们可以捕获小程序与服务器之间的通信数据,分析这些数据可以帮助我们发现潜在的安全漏洞,本文通过讲述三个方法在PC端来对小程序抓包渗透 文章目…...
数据结构:Win32 API详解
目录 一.Win32 API的介绍 二.控制台程序(Console)与COORD 1..控制台程序(Console): 2.控制台窗口坐标COORD: 3.GetStdHandle函数: (1)语法: (2)参数: 4.GetConsoleCursorInf…...
迁移学习中模型训练加速(以mllm模型为例),提速15%以上
根据模型训练过程的显存占用实测的分析,一个1g参数的模型(存储占用4g)训练大约需要20g的显存,其中梯度值占用的显存约一半。博主本意是想实现在迁移学习(冻结部分参数)中模型显存占用的降低,结果不太满意,只能实现训练速度提升,但无法实现显存占用优化。预计是在现有的…...
socket编程UDP-实现停等机制(接收确认、超时重传)
在下面博客中,我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程,并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接(进阶篇)_udp socket发送-CSDN博客 下面博客实现的是滑动窗口机制: sock…...
前端面试题目 (Node.JS-Express框架)[二]
在 Express 中如何使用 Passport.js 进行身份认证? Passport.js 是一个 Node.js 的身份验证中间件,它可以很容易地与 Express 集成。下面是一个简单的示例,展示了如何使用 Passport.js 进行基本的身份认证。 安装依赖 npm install express passport …...
防范TCP攻击:策略与实践
TCP(传输控制协议)是互联网通信的核心协议之一,它确保了数据在网络上的可靠传输。然而,TCP也容易成为各种网络攻击的目标,如SYN洪水攻击、TCP连接耗尽攻击等。本文将探讨如何通过配置防火墙规则、优化服务器设置以及采…...
3D 生成重建034-NerfDiff借助扩散模型直接生成nerf
3D 生成重建034-NerfDiff借助扩散模型直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 感觉这个论文可能能shapE差不多同时期工作,但是shapE是生成任意种类。 本文提出了一种新颖的单图像视图合成方法NerfDiff,该方法利用神经辐射场 …...
分布式 Paxos算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & Paxos算法 & 总结》《分布式 & Paxos算法 & 问题》 参考文献 《图解超难理解的 Paxos 算法(含伪代码)》《【超详细】分布式一致性协议 - Paxos》 Basic-Paxos 基础帕克索斯算法…...
我的宝贵经验
在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它是知识传承的载体,是团队协作的桥梁,更是产品成功的幕后英雄。然而,打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼?是否纠结…...
geoserver 瓦片地图,tomcat和nginx实现负载均衡
在地理信息系统(GIS)领域,GeoServer作为一个强大的开源服务器,能够发布各种地图服务,包括瓦片地图服务。为了提高服务的可用性和扩展性,结合Tomcat和Nginx实现负载均衡成为了一个有效的解决方案。本文将详细…...
Jenkins 启动 程序 退出后 被杀死问题
参考 Spawning Processes From Build (jenkins.io) 解决jenkins脚本启动项目后进程被杀死_jenkins杀进程-CSDN博客...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
