作者归档:myblog_toky

macOS升级至big sur后brew报错

问题描述

升级至macOS big sur后使用hexo报错,发现使用brew update也错误,部分报错如下:

Error: An exception occurred within a child process:   NoMethodError: undefined method `path' for nil:NilClass Did you mean?  paths

解决方案

使用命令brew update-reset升级Homebrew即可[1]

References

[1] https://discourse.brew.sh/t/homebrew-installation-fail/7439

新装Ubuntu打开Settings死机

最近给笔记本加了一块新的SSD,然后打算再装一个Linux,尝试一下其作为主力系统。最后试了Manjaro、Ubuntu、Kali等,本来想试试Arch系,最后还是回到了Debian(Ubuntu)的怀抱(真香警告)。

在新装完Ubuntu20.04LTS后,发现其一打开Settings等就会死机,怀疑是新版本的问题,于是再装了
一下Ubuntu18.04LTS,结果还是同样的问题。因此能初步判断是自身的问题。

后来找到了,是因为我的笔记本是双显卡,Intel核显+NVIDIA GTX1060。而Ubuntu的显卡驱动nouveau对独显不支持。

解决方案是:

  • 方法1:禁用nouveau,方法可参考:链接
  • 方法2:卸载nouveau,参考:链接

如何高效自律学习?

如何高效自律学习

今天看到B站UP主”马戏糍“的一个视频,讲解如何在家提高学习效率,感觉挺实用,尝试着执行一下,作以下记录。

下面会以自己一天的规划为例。

今天做什么?

  • 使用OKR(Object + Key Results, 关键目标 + 关键结果)管理法
  • 重要的是成果,而不是时间
  • 最多5个O,每个O最多4个KR
  • 遵循SMART原则

有效的OKR制定一定是满足SMART原则:

  1. Specific:明确性,目标必须是明确的,不能是模棱两可或含糊不清的,比如“优化客户服务意识”就不是一个明确的目标。

  2. Measurable:可衡量,关键结果必须是可衡量的,可用于衡量的方法有:基线法、里程碑法、正向度量法、负向度量法等,如“用户留存时间从60分钟提升为80分钟”就是一个可衡量的关键结果。

  3. Attainable:可实现,OKR鼓励在设定目标时具有一定的野心,但也要考虑可实现的,不能天马行空设定一个无法实现的无意义目标。

  4. Relevant:相关性,公司级目标要跟公司的战略对齐,部门级目标要跟公司目标对齐,个人目标要跟部门目标对齐,这样才能确保全员目标聚焦。

  5. Time-bound:时限性,没有时间限制,目标的制定就失去了意义,在OKR实施中,时限性体现在周期的设定上。

作者:李会军
链接:https://www.zhihu.com/question/22471467/answer/220121306
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 例如,今天我的OKR表

先做哪一个?

  • 使用重要紧急坐标轴,帮助自己决定先做哪一个,在时间紧迫的情况下选哪一个(重要还是紧急)

  • 例如,今天我的重要紧急坐标图

怎么安排时间做?

  • 针对每个O,每个KR,采用番茄钟时间管理法

  • 例如,我的番茄钟时间规划表

早晚checklist

  • 早上写完,对照OKR和坐标轴
  • 晚上检查效果,查看漏掉的事项

提高专注力

  • 要有一定的仪式感,换衣服换鞋

  • 运动,可以提高专注力和创造性思维

  • 在嘈杂的环境下,可以听一些白噪音

一种通用的学习过程

一种通用的思考过程

在《哈默手稿》,手稿三十,关于水的15种研究 中有写到:

这说明列奥纳多·达·芬奇在一些基本原则的基础上演绎水科学的定义,然后从概况的描述慢慢演绎到具体地解决问题。

这是大英图书馆对该部分手稿的说明。从中可了解几个关键的点:

  • 基本的原则
  • 演绎某方面的定义
  • 演绎即假设、模拟、演算
  • 从概况的描述开始
  • 慢慢演绎到具体地解决问题。

具体地看,手稿中不断提出”如果”的假设(在基本原则的基础上),得出推导的“那么”结果。一步步地进行模拟、演算,到后面得出一个具体的概念,最后又进行逆向思考和总结。

学习某一方面的知识时,也可以参加这种范式。

移动应用程序渗透

移动应用程序渗透

Android系统架构与运行机制

1.应用层(System Apps)
用户接触的,应用软件方面的

2.应用架构层(Application Framework, API)
系统开发的,API方面的
例如有以下的这些管理器:
活动管理
位置管理器
包管理器
通知管理器
资源管理器…

3.系统运行库层(Native)
分为两部分,分别是C/C++程序库和Android运行时(Runtime)库

4.硬件抽象层(HAL)
~位于操作系统内核与硬件电器之间的接口层,其目的在于将硬件抽象化

5.Linux内核层(Linux Kernel)

Android运行机制

  1. 简化版:init启动 —— Zygnote进程启动—— Systemserver进程启动

  2. Init启动
    总:电源键——系统启动——bootlooder——Linux内核——init进程启动

– 在启动init进程中,会进入system/core/init/init.cpp文件的main方法中
– 创建和挂载目录
– 初始化和启动属性服务(键对值)
Linux内核——盘古,开天地,产生女娲(Zygote)

  1. Zygote进程启动(被称为孵化器,一切的开始)
    总:app_main——AndroidRuntime——Zygoteinit

– socket
– 加载了一些类
– 启动systemserver类
Zygote——女娲,造出亚当(SystemServer)

  1. SystemServer进程启动

– frameworks/base/core/java/com/android/intermal/os/Zygote,.java
– frameworks/base/core/java/com/android/intermal/os/RuntimeInit.java
– frameworks/base/core/java/com/android/server/SystemServer.java 这个是各种进程的父类
SystemServer——亚当,用肋骨造夏娃(其他进程)

Android应用渗透测试与调试

工具使用

  1. Android Debug Bridge(ADB,要添加到系统环境变量)
adb kille-server
adb start-server
adb root
# push 把文件从电脑推送到Android上
adb push
# pull 把文件从Android下载到电脑上
adb pull
adb connect
adb shell
adb install -t
# 查看日志
adb logcat
# 应用截屏
adb exec-out screencap -p > sc.png
  1. Apktool(Smali语言,打包,解包)
  2. Frida(可以把自己的脚本注入到应用程序的运行进程中)
  3. Jadx(一件反编译,反编译为Java代码;可以在GitHub上下载)
  4. Android Studio(如何写Xpose插件;logcat,找flag)
  5. Android Killer

文件格式

  1. Lib——程序依赖的native库
    一般会有三类:

– arm
– arm-v7a
– x86
根据不同的虚拟机版本,下载Xpose框架(酷安;官网),注意不同的框架是使用不同的汇编等方式的

  1. META-INF目录——存放应用程序签名和证书的目录
  2. Res目录——存放应用程序的资源
  3. AndroidMainfest.xml——应用程序的配置文件
    相当于书本的目录,上面有很多的信息
  4. Classes.dex——Dex可执行文件
  5. Resource.arsc——资源配置文件

Android应用渗透测试——客户端数据安全

安装包签名校验

如何校验

$ jarsigner -verify APK_PATH

主要提供完整性integrity的保护

$ jarsigner -verify -verbose -certs APK_PATH

使用Google提供的开发者签名进行重签名。
要读懂Java代码,Smali代码。

客户端程序保护

反编译为Java代码

使用jadx,Androidkiller(综合使用前两者,但不能同时打开同一个文件),jeb等工具进行反编译

反编译为smali代码

$ apktool d APK_PATH
$ apktool b Uncompressed_APK_PATH

如何阅读smali代码

对比Java学习

smali类型

smali对象

smali

# smali注释
.method 表示方法开始
.local 1 表示locals的寄存器数量
.line 8 表示对于的Java代码行数
invoke-XXX 表示各种方法
invoke-super(p0,p1) p0,p1表示寄存器


图:smali代码阅读示例

应用完整性校验

aoktool d APK_PATH

注意res/文件夹

Android应用渗透测试——组件安全

判断组件的可导出性

  1. 根据AndroidMainfest.xml,判断以下组件是否可以导出

使用Drozer对四大组件进行组件攻击

工具:drozer

根据PPT中的代码进行实验测试。
https://blog.csdn.net/jianglianye21/article/details/80667346

Activity

# 使用工具drozer,自动会进行DoS攻击
$ run app.activity.info -a packagename

Service

$ run app.service.info -a packagename

Broadcast Reciever(广播接收器)

e.g. 电池电量低的提示

$ run app.broadcast.info -a packagename

Content Provider

可能存在目录遍历漏洞,SQL注入漏洞

$ run app.provider.info -a packagename
# 检测SQL注入(SQLite)
$ run scanner.provider.injection -a com.mwr.example.sieve
# 检测目录遍历
$ run scanner.provider.traversal -a com.mwr.example.sieve

原理和4种拒绝服务攻击

intent本身可以在不同组件间调用

*概念补充——intent:

​ intent是Android组件之间进行交互的重要方式,主要有两大功能:

​ (1)指明当前组件先要执行的操作。比如在Activity之间穿梭。

​ (2)在不同组件之间传递数据。 比如将Activity中的数据发送到Broadcast Reveiver。

  1. intent本地DoS攻击检测
    getIntent()
    Intent.getXXXExtra()

  2. 4种拒绝服务攻击的类型

  • NullPointerException异常导致的拒绝服务
  • ClassCastException异常导致的拒绝服务
  • ClassNotFoundException异常导致的拒绝服务
  • IndexOutOfBoundsException异常导致的拒绝服务

扩展

扩:学习smali代码时,可以结合实例直接阅读学习,不建议从头开始学

扩:渗透测试的主要方向:

1.通过研读本地应用程序(黑/白盒测试)

2.通过网络抓包进行分析

扩:找到能导出的各个组件,一一确认其安全性

Android应用渗透测试——WebView

如何检测和判断[TODO ]

WebView 任意代码执行

漏洞点:addJavaScriptInterface()

WebView 密码明文存储


使用方法:Sqlite databases broswer,可以把密码明文可视化显示

WebView 域控制不严格

域校验不严格,跨过同源策略进行跨域访问
setAllowFileAccess
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURL

Android应用渗透测试——敏感信息安全

CTF中可能比较重要的出题点

检查配置文件

CTF的重点检查内容
1. 检查客户端程序存储在手机中的 SharedPreferences 配置文件
2. 检查客户端程序存储在手机中的 SQLite 数据库文件
3. 检查客户端程序存储在手机中的 SharedPreferences 配置文件,在检测 SQLite 数据库文件,在私有目录及其子目录下查找以.db 结尾的数据库文件。
通常是对本目录(data/data/packagename)下的文件内容 (一般是 xml)进行检查,看是否包含敏感信息。

检查客户端程序包(APK)中是否保存有敏感信息

  1. 证书文件
  2. 逻辑js文件
  3. 图片文件
  4. 其他文件(把文件存储到SD卡,或者不是同一个package下)
  5. logcat日志(AS上使用,并且安装Xinstaller)

Android应用渗透测试——进程安全

内存访问和修改

安装插件Memspector [TODO]

通过对客户端内存的访问,有可能会得到保存在内存中的敏感信 息(如登录密码,帐号等)。测试客户端内存中是否存在的敏感信息(卡号、明文密码等等)。

本地端口开放检测

e.g. socket的一些管理缺陷,查找端口,连接端口,获取验证码信息

外部动态加载DEX安全风险

  1. 风险位置:
    public DexClassLoader(String dexPath,String optimizedDirectory, String libraryPath, ClassLoader parent)

  2. 查看 AndroidManifest.xml 包 package 值相对应路径下的文件中是否含有DexClassLoader()函数调用

Android应用渗透测试——通信安全

抓包

  1. http协议
  2. https协议
  3. 校验不严格
  4. 双向校验
  5. 其他协议

应用程序可能会有设置,防止被抓包

http协议

比较常规的,Android设置代理,BP抓包

参考教程:链接

https

抓https包需要设置证书,Android7.0以上需要把证书安装在系统上,7.0以下 [TODO]

参考链接

证书未校验

证书部分校验

https双向校验

  1. 单向认证
  2. 双向认证
    增加了服务端认证客户端的过程,添加第4步

  3. 步骤

– 找到证书导入到burp
– 寻找包里的证书库文件(敏感信息泄漏)
– 尝试证书转换


  • 找到证书库文件
  • 找到证书库密码
  • 把密码导入(尝试证书转换)

扩展-1

扩:漏洞,不是攻击点,通常都是攻击链
扩:使用Everything工具,添加到右键,方便搜索文件(Windows)
扩:证书管理工具Portecle
扩:使用所有手段都没有抓到包,该怎么办?[TODO,老师私货,重要]
使用aptables进行流量转发

iptables -t nat -A OUTPUT -p tcp -dport 目标端口 -j DANT --to burpip和端口

移动应用数据包常见加密形式

明文数据包

e.g. 参数 info整个不加密

参数值加密

e.g. 参数 info后面的值加密

POST BODY加密

e.g. post的所有数据都加密

参数序列化

Response加密

定位关键代码

静态分析

重点是:定位关键字

  1. 关键字——搜索参数[key]
    [key]:需要关注的参数
    使用双引号, “&”, “=”等字符,辅助定位

  2. 关键字——搜索接口
    以接口作为关键字全局搜索 目录、接口、双引号辅助搜索

  3. 关键字——搜索header
    用header中各种标志性的字符做关键字 全局搜索
    HOST、标志性的head字符
    e.g. okhttp/3.8.0

  4. 关键字——搜索加密算法
    AES、RSA、DES、SM(国密,2020年刚开始实行)等常见加密算法做为关键字,用双引号、/等符号辅助,精确定位

  5. 关键字——从日志中获取关键字
    Logcat中获取现成的关键字,传输的信息可能加密,但日志信息(开发时方便调试所开启的)没有加密。

  6. Javascript加密

扩展-2

  1. 使用Xpose插件:Inspeckage,直接在Xpose软件里下载

Android应用渗透测试——业务安全

  1. 二维码不校验
  2. url跳转
  3. 任意文件读取

不具体展开,和Web业务安全同样的。

如何找客户端漏洞?

都在上述的知识点中

Android应用渗透测试——应用调试

调试Smali

参考教程:

https://blog.csdn.net/hebbely/article/details/79087199

https://www.jianshu.com/p/9843e80f5ac5

调试native

  1. 找到native方法

  2. 找到.so文件

  3. IDA Pro 打开
    发现export处[TODO]

中文乱码设置:
alt + a,然后进行如下设置

  1. 使用IDA Pro进行分析

  2. push android_x86_server 到 data/local/tmp

分析点

在输入的参数(比如用户名、密码)处下断点,通过查看运行时信息(终端显示的),分析其加密方式。不仅如此,证书校验等都可以使用这个动态调试的方法。

移动应用程序渗透测试框架使用

Xposed框架

安装及配置

[TODO]

Xposed运行原理[TODO]

  1. Dalvik虚拟机在执行java层代码时如何识别JNI方法?

– 类型标识(accessFlags)

– 过程

  1. 怎样才能将java层普通方法注册成JNI方法?
  2. Xposed框架做了什么?

如何写一个Xposed插件[TODO]

  1. 打开AS在项目app目录下新建lib目录并将XposedBridgeApi-54.jar放到lib目录下 右键Add As Library将 jar包添加进依赖。

  2. 打开app目录下的build.gradle 将
    compile files(‘lib/XposedBridgeApi-54.jar’)
    更改为
    compileOnly files(‘lib/XposedBridgeApi-54.jar’)

  3. 打开项目分支src/main目录下的AndroidManifest.xml 在application标签里面添加内容

  4. 新建Hook入口类HookMain 实 现 xposed的接的IXposedHookLoadPackage 并重写方法 handleLoadPackage ,这个写法格式是固定的。

  5. 在src/main/assets下新建文件xposed_init并将HookMain类并将hook的主入口类以包名+类名的格式写进去。
    com.example.myapplication.HookMain

Frida框架[TODO]

Frida是一个动态代码执行工具包。
通过Frida你可以把一段JavaScript注入到一个进程中去,或者把一个动态库加载到另一个进程中去,并且 Frida 是跨平台的,也就是说,你可以对Windows, macOS, GNU/Linux, iOS, Android以及QNX系统上的进程进行上述操作。

Frida实验1——破解登入密码

Frida实验2——解密

扩展-1

注意:安装Frida时,一定要安装Frida tools