0x00 前言

本文中所介绍的方法目前只测试了单个的demo,并没有拿大型的项目做测试,但是应该是大同小异。这里介绍两种方法,一种是有独立的ARM硬件,另一种是依靠qemu实现的模拟化,其实其本质都是一样的。如果是大型项目的话最好还是建议有一个原生的环境,毕竟模拟环境通常会遇到一些意外的事。

0x01 依靠qemu搭建环境

环境准备

  • ubuntu 20.04

这里我的物理机是ubuntu,虚拟机一样的。首先需要安装一下qemu的环境和编译ARM汇编机器码的交叉gcc编译器,其安装命令如下

luna@ubuntu:~$ sudo apt update -y && sudo apt upgrade -y
luna@ubuntu:~$ sudo apt install qemu-user qemu-user-static gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu binutils-aarch64-linux-gnu-dbg build-essential

然后我们编写一个测试代码,来验证编译和执行的效果

#include <stdio.h>

int main(void) {
printf("hello\n"); return 0;
}

然后在编译的时候添加一个-static选项,否则在程序执行时会出现动态链接库找不到的情况

luna@ubuntu:~/study/c$ aarch64-linux-gnu-gcc -static -o test test.c

然后执行查看结果

luna@ubuntu:~/study/c$ ./test
hello

到目前为止执行是没有什么问题了,接下来就是调试的问题,调试我们需要安装一下gdb的多架构支持版本,在ubuntu中只需要执行一下命令

sudo apt-get update && apt install gdb-multiarch -y

然后就是调试的设置了

0x02 调试

这里由于本地执行调试的话会出现问题,所以只能选择远程调试的方式,调试步骤如下,首先用qemu运行被调试程序,指定gdb远程调试端口为1234,文件名为test

luna@ubuntu:~/study/c$ qemu-aarch64 -L /usr/aarch64-linux-gnu/ -g 1234 ./test

然后在另外一个终端中,我们打开gdb-multiarch,然后键入如下的指令链接到远程目标

pwndbg> target remote 127.0.0.1:1234
pwndbg> file ./test
Reading symbols from ./test...

这样就可以通过源码调试的方式来调试程序了,结果如下图所示

0x03 动态链接的方式如何调试

刚才的调试环境基本接近完美,但是,问题是如过目标程序是动态链接的呢?这在实际的测试中是个大问题,解决的办法是在打开gdb以后指定一个路径,如下

For AArch64:
(gdb) set solib-search-path /usr/aarch64-linux-gnu/lib/

0x04 物理设备

在捣鼓了模拟环境以后,突然看到了之前淘汰的一个小米手机,刚好可以拿来作为ARM64的实际环境,首先需要安装一个termux,安装以后需要装一下ssh,基本步骤如下(注意,是在termux中操作)

#安装OpenSSH
$ pkg install openssh #运行SSH Server
$ sshd #设置密码
$ passwd #获得Android IP
$ ifconfig #PC端连接
$ ssh 用户名@ip -p 8022

注意手机必须和PC在一个网段内,然后在其上安装gccgdb

$ pkg install gcc gdb

然后就可以开心的调试了,

这里的一个问题是不能安装gdb的插件,如果不习惯的话可以用之前的远程调试来达到目的

#在手机端
gdbserver :1234 a.out #PC端
pwndbg> target remote 192.168.0.100:1234

linux搭建ARM可调式环境的更多相关文章

  1. Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

    Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...

  2. Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统

    Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...

  3. Qemu搭建ARM vexpress开发环境(一)

    Qemu搭建ARM vexpress开发环境(一) 标签(空格分隔): Qemu ARM Linux 嵌入式开发离不开硬件设备比如:开发板.外设等,但是如果只是想学习研究Linux内核,想学习Linu ...

  4. 2019.03.03 - Linux搭建go语言交叉环境

    编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO 搭建go语 ...

  5. win10下用Linux搭建python&nodejs开发环境

    Win10下用自带Linux系统搭建开发环境 Win10下用自带Linux系统搭建开发环境启用Linux老版本(win10 1709之前):新版本(win10 1709之后)卸载linux老版本新版本 ...

  6. Linux 搭建Nginx+uWSGI+Django环境

    安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...

  7. 用Linux 搭建 PXE 网络引导环境

    本例子中使用了CentOS7.4 minimal 系统,并且关闭了防火墙和selinux,并使用了dhcp.tftp.http和samba服务. 假设PXE服务器是192.168.4.104 ,tft ...

  8. Linux搭建PHP+MySQL+Apache环境

    环境: CentOS 6.4 MySQL详细安装可参考:http://www.cnblogs.com/yangxia-test/archive/2012/11/12/2766237.html Apac ...

  9. 如何在linux搭建airtest+chromeweb测试环境--(用命令行运行.air脚本)

    大前堤: 如果你需要airtest提供的可视化测试报告,那你的操作系统,一定要有图形化界面. 否则运行你的airtest脚本 会遇到这样的问题 Xlib.error.DisplayNameError: ...

随机推荐

  1. 网络知识扫盲——DNS

    参考文章链接  : https://baijiahao.baidu.com/s?id=1668393227924896391&wfr=spider&for=pc 一.DNS 是什么? ...

  2. [BUUCTF] 真的很杂

    这似乎是一道安卓逆向题??我就是没有搞懂安卓逆向原来是misc吗... 安卓逆向一个例子 工具准备 1.apktool--可以反编译软件的布局文件.图片等资源,方便大家学习一些很好的布局: 2.dex ...

  3. [PASECA2019]honey_shop writeup

    这是PASECA2019的一道web题 前端是一个蜂蜜商店,你有$1336,可以买蜂蜜和flag.但是flag要$1337,所以我们只能买蜂蜜. 一般这种题目的常规操作就是通过修改你的钱使你能够买到f ...

  4. Code-Review-Maven编译(第三方jar包引用)

    Code-Review-SpringBoot-Maven编译(第三方jar包引用) 在使用maven编译项目时,有时候咱们可能会使用一些第三方的jar包依赖库,比如第三方支付类的接入,大多出于安全考虑 ...

  5. 在vue 中 element-ui table结合Popover使用

    在vue 中 element-ui table结合Popover使用 <el-table-column label="操作" > <template slot-s ...

  6. 深入浅出!阿里P7架构师带你分析ArrayList集合源码,建议是先收藏再看!

    ArrayList简介 ArrayList 是 Java 集合框架中比较常用的数据结构了.ArrayList是可以动态增长和缩减的索引序列,内部封装了一个动态再分配的Object[]数组 这里我们可以 ...

  7. 编写通用的Makefile

    一个应用程序的形成是少不了一下几个步骤的. 1. 预处理 #检查语法错误.包含头文件.展开#if.#define等宏定义 2. 编译 #把.c文件转换为汇编文件.s 3. 汇编 #把.s汇编转换为机器 ...

  8. 所有CSS字体属性

    font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...

  9. 痞子衡嵌入式:Farewell, 我的2020

    -- 题图:苏州大学老校门 2020年的最后一天,痞子衡驱车300多公里从苏州赶回了苏北老家(扬州某边陲小镇),连镇铁路虽然新通车了,解决了苏南苏北多年的铁路不直通问题,但奈何痞子衡老家小镇离最近的火 ...

  10. 使用jmeter进行压力测试与nginx连接数优化

    案例训练目标 学会使用jmeter工具 学会配置nginx连接数优化 包含技能点 使用jmeter做压力测试 配置nginx的并发连接数 环境要求 PC支持VT,4G内存以上:vmware虚拟机安装有 ...