0%

PWN环境搭建

1.选择合适的系统

​ 个人推荐Ubuntu16.04 64bit,当然其他版本或其他系统也是可以的

2.进行环境的配置

  • 安装gcc

    由于16.04的系统自带的是5.x版本的gcc,使用其编译程序会有很多其他保护机制不利于新手学习,推荐使用gcc-4.8版本(如何降级安装看)

  • 安装gdb-peda(便于进行调试)

    1
    2
    git clone https://github.com/longld/peda.git ~/peda
    echo "source ~/peda/peda.py" >> ~/.gdbinit
  • 安装pwntools(便于编写exp)

    1
    pip install pwntools
  • 安装32位libc库(用于32位程序)

    1
    apt-get install libc6-dev-i386

angr的安装(以ubuntu为例)

  • sudo apt install python3-dev libffi-dev build-essential virtualenv 安装python3环境及一系列支持库
  • mkdir angr&&cd angr&&virtualenv -p python3 angr创建名为angr的文件夹,并在其中安装Python3虛拟环境
  • source angr/bin/activate激活名为angr的Python3虚拟环境
  • pip install angr在Python虚拟环境中安装angr

https://github.com/jakespringer/angr_ctf

https://docs.angr.io/examples

调试器状态检测

根据android的官方文档,如果调试一个APK,必须满足以下两个条件中的任何一个:
1 APK的AndroidManifest.xml文件中的Application标签包含android:debuggable="true"
2 /default.prop中的ro.debuggable=1
根据Android SDK提供的android.os.Debug.isDebuggerConnected()方法可以进行判断程序是否被调试器调试了。

因此,当程序被设定为禁止调试时通过修改android:debuggable="true"来进行反反调试就行不通了,此时只能进行修改boot.img等方法来进行反反调试了。

调试器端口检测

调试器远程调试时,会占用一些固定的端口号,如23946。因此可进行读取/proc/net/tcp进行查看,若发现23946端口正在被使用,则说明程序在被调试。

可以在启动调试程序时修改端口,如使用命令./android_server -p12345以及adb forward tcp:12345 tcp:12345进行反反调试。

阅读全文 »

对于加固,是将加密后的dex文件与壳文件合并生成新的class.dex文件,然后签名重打包生成加固后的apk文件。而对于壳程序加载原dex文件,是dalvik虚拟机加载加固后的apk里的classes.dex文件,并使用attachBaseContext方法以及onCreate方法进行解密原dex文件并启动原程序。但是无论进行了怎样的加密,最后都是需要经历解密动态加载到内存中的,利用这一点即可进行dump出dex文件。

dump内存法一

通过分析底层加载dex源码发现libdvm.so中的dvmDexFileOpenPartial函数,该函数有两个参数,一个是dex的起始地址,一个是dex的大小。于是可以使用ida进行动态调试获取信息。

  • 安装好apk,并以调试方式运行

  • 启动调试服务并进行端口转发

  • pull出/system/lib/libdvm.so文件

阅读全文 »

调试dex

  • 将被调试文件以及对应版本的android_serverpush到/data/local/tmp(可为其他)

  • 修改两者的权限为可执行权限,chmod 777 xxx

  • 启动调试服务,./android_server

  • 进行端口转发,adb forward tcp:23946 tcp:23946,使PC端口与Android端口可进行交互

  • 启动ida,Debugger->Run->RemoteArmLinux/Android debugger并设置好对应的参数(被调试文件的路径)

  • 设置好端口号(默认23946)点击OK则开始调试

调试so

  • 安装好apk,并运行
阅读全文 »

Fuzzing的概念

模糊测试(Fuzzing),是一种软件测试技术,通过向目标系统提供非预期的自动或半自动的生成随机数据输入并监视异常结果来发现软件或计算机系统漏洞。

AFL概念

AFL(American Fuzzy Lop)是一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。

AFL工作流程

  1. 从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage)
  2. 选择一些输入文件,作为初始测试集加入输入队列(queue)
  3. 将队列中的文件按一定的策略进行“突变”
  4. 如果经过变异文件更新了覆盖范围,则将其保留添加到队列中
  5. 上述过程会一直循环进行,期间触发了crash的文件会被记录下来
阅读全文 »

linker的工作原理:将目标SO文件的LOAD段映射内存,解析文件格式,做好符号重定位,再调用init/init_array方法等等

可以自己实现类似于linker的加载代码,而不是通过调用dlopen函数来加载解释器SO

由于项目是前后端分离的,前端用的vue-elemnet框架,后端用的是flask。而项目的最终是要将数据库中的数据通过flask读取然后传给前端进行展示,于是前后端之间的数据传输在所难免。询问朋友后决定使用axios进行数据的传输。

axios

  • 安装
    npm install axios
    npm install --save axios vue-axios

  • main.js中导入
    import axios from 'axios'
    import Vueaxios from 'vue-axios'
    Vue.use(Vueaxios, axios)

阅读全文 »

ElementUI

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。详见官网

安装

  • 安装nodejs

  • 安装脚手架环境

    npm install -g vue-cli
    npm install webpack -g

  • 创建一个基于webpack模板项目

    vue init webpack xxx(xxx为项目名)

  • 安装依赖

    npm install

  • 启动项目

    npm run dev

  • 安装element-ui

    npm i element-ui -S

  • 导入element-ui

    1
    2
    3
    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css'
    Vue.use(ElementUI) //全局使用ElementUI

使用

ElementUI官网提供了一系列组件,使用简单,体积小,可以快速上手。而且github上有个后台前端解决方案vue-element-admin项目,可以在此项目基础上进行修改来达到自己的使用目的。