MTK use GDB to debug KE by get break point in file

本文详细介绍了如何使用GDB工具在Android N0版本和kernel-3.18环境下,通过加载vmlinux文件进行地址定位、函数查找和调试流程解析的过程,为开发者提供了一套完整的调试方案。
[   18.281609] <0>-(0)[1:init][name:traps&]Call trace:
[   18.282223] <0>-(0)[1:init][<ffffffc00008a2c0>] dump_backtrace+0x0/0x190
[   18.283054] <0>-(0)[1:init][<ffffffc00008a574>] show_stack+0x14/0x1c
[   18.283847] <0>-(0)[1:init][<ffffffc000c1f118>] dump_stack+0xbc/0xf8
[   18.284638] <0>-(0)[1:init][<ffffffc00090bf88>] arch_reset+0x6c/0x1a8
[   18.285439] <0>-(0)[1:init][<ffffffc00090c120>] mtk_arch_reset_handle+0x5c/0xf4
[   18.286351] <0>-(0)[1:init][<ffffffc0000c5628>] notifier_call_chain+0x88/0x2d4
[   18.287251] <0>-(0)[1:init][<ffffffc0000c5a88>] atomic_notifier_call_chain+0x64/0x94
[   18.288217] <0>-(0)[1:init][<ffffffc0000c7048>] do_kernel_restart+0x24/0x2c
[   18.289084] <0>-(0)[1:init][<ffffffc000086548>] machine_restart+0x90/0xbc
[   18.289930] <0>-(0)[1:init][<ffffffc0000c7228>] kernel_restart+0x90/0x128
[   18.290776] <0>-(0)[1:init][<ffffffc0000c76b8>] SyS_reboot+0x1cc/0x214

以上方reboot的log为例,用gdb 和 vmlinux 查看ffffffc0000c76b8对应的函数。


=====================================================================================

软件版本Android N0,kernel-3.18,平台mt8163

源码根目录是trunk-n0.tk


1,查找GDB
[trunk-n0.tk]$cd ./prebuilts/gcc/linux-x86/

[linux-x86]$find -name "*-gdb"
./aarch64/cit-aarch64-linux-android-4.9/bin/aarch64-linux-android-gdb
./arm/arm-eabi-4.8/bin/arm-eabi-gdb
./arm/cit-arm-eabi-4.8/bin/arm-eabi-gdb
./arm/cit-arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gdb
./arm/gcc-arm-none-eabi-4_7-2012q4/bin/arm-none-eabi-gdb
./arm/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-gdb


平台是64bit,采用aarch64。回到根目录

[linux-x86]$cd -
/trunk-n0.tk

2,开GDB,加载vmlinux
[trunk-n0.tk]$./prebuilts/gcc/linux-x86/aarch64/cit-aarch64-linux-android-4.9/bin/aarch64-linux-android-gdb  ./out/target/product/tb8163p3_64/obj/KERNEL_OBJ/vmlinux


GNU gdb (GDB) 7.6

Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=aarch64-elf-linux".
For bug reporting instructions, please see:
<http://source.android.com/source/report-bugs.html>...
Reading symbols from /trunk-n0.tk/out/target/product/tb8163p3_64/obj/KERNEL_OBJ/vmlinux...done.
(gdb)

3,查看地址对应的函数信息
(gdb) list *(0xffffffc0000c76b8)
0xffffffc0000c76b8 is in SyS_reboot (/trunk-n0.tk/kernel-3.18/kernel/reboot.c:346).
341                             ret = -EFAULT;
342                             break;
343                     }
344                     buffer[sizeof(buffer) - 1] = '\0';
345
346                     kernel_restart(buffer);
347                     break;
348
349     #ifdef CONFIG_KEXEC
350             case LINUX_REBOOT_CMD_KEXEC:
在调试和监控 payload 攻击行为时,使用 GDB(GNU Debugger)结合 tmux 可以提供强大的调试能力和多窗口管理能力。以下是如何使用 GDB 和 tmux 来调试并监控 payload 的行为。 ### 准备工作 在开始之前,确保宿主机和容器中都安装了必要的调试工具: - 安装 GDB:`sudo apt-get install gdb` - 安装 tmux:`sudo apt-get install tmux` - 确保目标程序已编译为可调试模式(使用 `-g` 选项)[^1] ### 启动调试环境 首先,启动一个带有调试功能的容器,并将本地目录挂载到容器中以便共享调试文件: ```bash docker run -it --rm -v $(pwd):/mnt -p 1234:1234 --cap-add=SYS_PTRACE roderickchan/debug_pwn_env /bin/bash ``` ### 使用 tmux 管理多窗口 进入容器后,启动 tmux 会话,以便在多个窗口之间切换: ```bash tmux new -s debug_session ``` 在 tmux 中,可以使用 `Ctrl+b c` 创建新窗口,使用 `Ctrl+b n` 或 `Ctrl+b p` 切换窗口。 ### 在 GDB 中加载程序并设置断点 在一个 tmux 窗口中启动 GDB 并加载目标程序: ```bash gdb /mnt/target_program ``` 在 GDB 中设置断点以监控 payload 的执行路径: ```gdb break main run ``` 可以使用 `disassemble` 命令查看汇编代码,并在关键函数或系统调用处设置断点。 ### 监控 payload 行为 在另一个 tmux 窗口中,可以使用 `strace` 或 `ltrace` 来监控程序的系统调用和库函数调用: ```bash strace -p <pid> ``` 其中 `<pid>` 是 GDB 中运行程序的进程 ID。 ### 附加到远程调试会话 如果程序运行在远程服务器上,可以使用 GDB 的远程调试功能: ```gdb target remote :1234 ``` 确保远程服务器上已启动 `gdbserver`: ```bash gdbserver :1234 /mnt/target_program ``` ### 示例 GDB 调试会话 假设你已经附加到远程调试会话,以下是 GDB 中的一些常用命令: ```gdb break *0x08048450 # 在特定地址设置断点 continue # 继续执行程序 stepi # 单步执行指令 info registers # 查看寄存器状态 x/10x $esp # 查看栈顶内容 ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值