攻防世界安卓刷题笔记(新手模式)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博客...

SEGGER | 基于STM32F405 + Keil - RTT组件01 - 移植SEGGER RTT
导言 RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的技术,它结合了SWO和半主机的优点,具有极高的性能。 使用RTT可以从MCU非常快速输出调试信息和数据,且不影响MCU实时性。这个功能可以用于很多支持J-Link的设备和MCU࿰…...

分布式开发学习
1、kratos的特点 gRPC:Kratos 默认支持 gRPC,提供高性能的远程调用能力,适用于微服务间通信。 HTTP :同时支持 HTTP/1.1 和 HTTP/2,方便微服务与外部系统交互。 Protocol Buffers: protoc 工具生…...

freeswitch(开启支持MCU视频会议,使用mod_av模块)
亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景说明: 有些场景想使用视频会议MCU融合画面进行开会使用方法: 第一步:下载插件 yum install -y epel-release yum install...

Vue3常见api使用指南(TS版)
defineProps() 和 defineEmits() 内置函数,无需import导入,直接使用。传入到 defineProps 和 defineEmits 的选项会从 setup 中提升到模块的范围。因此,传入的选项不能引用在 setup 范围中声明的局部变量(比如设置默认值时),但是…...

分布式 分布式事务 总结
前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节…...

onnx文件转pytorch pt模型文件
onnx文件转pytorch pt模型文件 1.onnx2torch转换及测试2.存在问题参考文献 从pytorch格式转onnx格式,官方有成熟的API;那么假如只有onnx格式的模型文件,该怎样转回pytorch格式? https://github.com/ENOT-AutoDL/onnx2torch提供了…...

智能座舱人机交互升级
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源&…...

RabbitMQ中点对点(Point-to-Point)通讯方式的Java实现
RabbitMQ是一个广泛使用的开源消息代理软件,它实现了高级消息队列协议(AMQP)。RabbitMQ支持多种消息传递模式,其中最基本的是点对点(Point-to-Point)通讯方式。在这种模式下,消息生产者将消息发…...

爬虫实战:获取1688接口数据全攻略
引言 在电商领域,数据的重要性不言而喻。1688作为中国领先的B2B电商平台,提供了海量的商品数据。通过爬虫技术获取这些数据,可以帮助企业进行市场分析、价格监控和供应链管理。本文将详细介绍如何使用Python爬虫技术合法合规地获取1688接口数…...

生成树协议STP工作步骤
第一步:选择根桥 优先级比较:首先比较优先级,优先级值越小的是根桥MAC地址比较:如果优先级相同,则比较MAC地址。MAC地址小的是根桥。 MAC地址比较的时候从左往右,一位一位去比 第二步:所有非根…...