使用Nuclei IDE调试N900内核Linux启动

Skip to content

Navigation Menu

Nuclei-Software/nuclei-linux-sdk

Type / to search

Debug Linuxsdk using NucleiStudio

Huaqi Fang edited this page on Nov 12, 2024 · 16 revisions

How to Debug Linux SDK on NucleiStudio

关于Nuclei Linux SDK的编译开发使用, 参见 https://github.com/Nuclei-Software/nuclei-linux-sdk

本文档主要说明如何调试在板子上运行的程序,调试原理是用pc端openocd做gdb server,接收pc端gdb发送过来的命令,通过jtag与板子进行通信,完成相应命令的处理。 关于openocd的具体工作原理不在本文介绍之列,可以网上自行查阅相关资料。

下面以调试Linux Kernel 为例子,说明如何使用NucleiStudio IDE来单步调试程序, 其他程序调试可以参考此文档。

关于基本的Nuclei Studio IDE的调试功能参见 2.9. Nuclei Studio 调试运行工程 — Nuclei Development Tool Guide 2025.02 documentation

而Nuclei Studio IDE是基于Eclipse Embedded CDT项目,因此很多界面上的功能是一致的,所以搜索Eclipse CDT界面上相关调试使用技巧也基本适用,和具体硬件打交道的可能需要自行辨别下。

1.New Debug Configuration

和arm 调试工具类似,使用前需要配置调试参数。

  • 添加Debug Configuration

    双击NucleiStudio程序,进入如下界面,点击Run 可以看到有Debug Configurations的选项。 点击Debug Configurations,在左边界面找到GDB OpenOCD Debugging,双击GDB OpenOCD Debugging, 或者右键可以创建新配置New_configuration。右边选项卡MainDebuggerStartup是需要配置的。如需要映射路径,Source也需要配置。CommonSVD Path 暂未用到。

  • 配置Main 选项卡

  • 配置Debugger 选项卡

    如果openocd 与gdb 不是同一台pc,则需要设置remote target 的IP地址。一般NucleiStudio IDE安装目录下有openocd与gdb这两个工具

    cfg文件在Linux SDK中conf/$SOC/ 目录下,例如 evalsoc 方案的cfg路径:nuclei-linux-sdk\conf\evalsoc\openocd.cfg

    下图中openocd 是修改过的,所以没有使用IDE中自带的openocd。

  • 配置Startup 选项卡

    如果需要加载符号表,需要选上Load Symbol

  • 配置Source 选项卡

  • 下图中有两项path mapping 映射,理论上说,第一项就够了,但是本人电脑上需要创建第二个映射,原因未知。

    第一次使用时可以不配置path mapping,调试器会提示你找不到汇编对应的文件,这个时候再编辑路径映射。

  • 其他选项卡

    Common,SVD Path 没有用到。Debug Config 编写完成后,可以点击Apply 来保存配置,点击Debug 则可以开始调试。

2.Debug Program

软件调试的一切前提是务必先排查FPGA SoC原型是否是稳定的,例如如果有DDR,务必确认DDR 8/16/32/64位读写执行(随机,按序)是PASS的没有任何错误的,在一个出错的环境上调试只会错上加错,一团乱麻,其他的外设也是如此,有条件先通过裸机都验证完毕再上Linux内核调试,且我们的原型环境是日常CI回归跑Linux的,所以一般而言不会有问题的。

IDE上调试和gdb 调试原理上是一样的,只是gdb 输入的是命令,IDE上是以图形化呈现功能,人机交互IDE界面会更友好一些。

如果想通过gdb加载opensbi/uboot/kernel/rootfs到DDR上,而不是freeloader的方式,请参见 https://github.com/Nuclei-Software/nuclei-linux-sdk/issues/23

Nuclei Studio IDE里面的 Debugger Console Tab里面是可以直接输入gdb命令的,关于gdb命令的使用参见 gdb手册 Top (Debugging with GDB) , 也可以网上查看gdb相关的使用方法,这里网上有很多教程,不予赘述。

Note

可以在Nuclei Studio IDE里面使能Instruction Step Mode来使能按指令单步,这样方便定位具体异常出错点

  • 启动调试功能

    方法1:在刚配置完debug configure之后直接点击右下角Debug 按钮,

    方法2:点击IDE主界面上靠右边的小虫子按钮,会弹出所有debug 配置项,选择对应配置项启动调试。

  • 修改PC指针

    下图Linux内核代码中加入了死循环asm volatile("j .")指令,让cpu运行到此处时停下来,jtag调试器连上开发板就可以从断点位置开始调试了,调试前需要将pc值加4,让cpu从下一条指令开始执行。可以在下一条汇编代码上,右击鼠标选择Move to Line 来完成pc+4的功能。如没有加死循环指令,jtag 调试器连接开发板就是连上那一刻pc指向的指令,这个时候不需要改pc值。

  • 设置断点

  • 单步跟踪时,需要切换到按指令单步模式,就是i->  这个图标点击一下。在指令前双击可设置断点
  • 查看函数调用栈,寄存器,变量,断点,表达式,汇编

  • 查看内存

    内存地址可以是物理地址,也可以是虚拟地址(前提是系统开了MMU)

    如Memory 标签没有显示,可以在界面上选Window->Show View->Memory

  • 手动输入gdb 命令

3.QA

  • 1.单步调试出现断点异常提示

    出现这个错误提示,一般是跨image 调试时,出现此地址不在当前调试镜像内存范围内,所以跨镜像调试前,需要把断点删掉,以免出现错误调试。

  • 2.调试过程中重新加载符号表

    注意调试符号表使用的时候,请务必确保相关的代码编译的时候开启了 -g选项,最好调试优化等级能调整到 -Og 这样更方便源码对照。关于 opensbi/uboot/linux kernel如果开启调试选项,请自行搜索查找,这个和ARM基本一致。

    如果需要调试过程中,手动加载符号,可在Debugger Console框中用symbol-file命令来更新符号表。
    symbol-file Y:\\home\\guibing\\nuclei-linux-sdk\\work\\evalsoc\\linux\\vmlinux

  • 3.调试过程中没有源码对应

    可能的情况

    • 1.编译,链接时没有加-g选项
    • 2.加载elf和源码不是同一个工程
  • 4.uboot 重定位后符号对不上如何调试

    可以先按键中断uboot的自动启动,使其停在uboot 控制台界面,然后在Debugger Console中,输入如下命令获取符号偏移, 并使用-o 参数重新加载符号表,加载完成后,单步跟踪代码就可以对上。

# 获取符号偏移
p /x ((gd_t*)$gp)->reloc_off
$2 = 0x7dd8e000
# 用-o 参数重新加载符号表
symbol-file Y:\\home\\guibing\\nuclei-linux-sdk\\work\\evalsoc\\u-boot\\u-boot -o 0x7dd8e000
Load new symbol table from "Y:\home\guibing\nuclei-linux-sdk\work\evalsoc\u-boot\u-boot"? (y or n) [answered Y; input not from terminal]
Reading symbols from Y:\home\guibing\nuclei-linux-sdk\work\evalsoc\u-boot\u-boot...
  • 5.怎么定位具体异常是啥

根据当前程序所在模式,通过执行 info reg priv 获取当前模式。

  • 例如 Machine(M) 模式,就查看CSR mepc mcause mtval 来分别获取异常出错前的位置,异常原因,异常出错信息
  • 而 Supervisor(S) 模式,就查看CSR sepc scause stval相关寄存器来定位
  • 通过查看CSR mtvecstvec寄存器的值可以获知异常入口基地址,关于标准RISC-V异常CSR详细解析参见手册 riscv-privileged.pdf
  • Nuclei RISC-V处理器里面还额外定义了 mdcause/sdcause 来获知进一步异常的原因,详细参见 Nuclei_RISC-V_ISA_Spec.pdf

通过逐步分析异常出错的位置,反推上一级出错点,在对应的位置打断点,结合gdb 按指令单步(si)来具体定位出错点。

标准RISC-V CSR的详细解析请参见 riscv-privileged.pdf

Pages 4

Clone this wiki locally

Footer

© 2025 GitHub, Inc.

### 如何在Linux环境中使用Nuclei工具 Nuclei 是一款用于漏洞扫描和安全测试的开源工具,广泛应用于识别目标系统的潜在漏洞。以下是关于 Nuclei 工具安装、配置以及基本使用的详细介绍。 #### 安装依赖项 为了运行 Nuclei,在 Linux 环境下需要先安装 Go 编程语言环境,因为 Nuclei 使用 Go 构建而成。可以通过以下命令安装最新版本的 Go: ```bash sudo apt update && sudo apt install golang-go -y ``` 此操作适用于基于 Debian 的发行版(如 Ubuntu)。对于其他发行版,请参考官方文档获取适合的操作指南[^4]。 #### 下载并安装 Nuclei 完成 Go 的安装后,可以利用 `go install` 命令下载并编译最新的 Nuclei 版本: ```bash GO111MODULE=on go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest ``` 上述命令会自动将 Nuclei 及其所需模块安装至 `$GOPATH/bin/` 路径下。如果该路径未加入系统 PATH,则需手动将其添加到环境变量中: ```bash export PATH=$PATH:$(go env GOPATH)/bin/ ``` 验证安装是否成功可通过执行以下命令查看当前已安装的 Nuclei 版本号: ```bash nuclei -version ``` #### 配置模板库 Nuclei 功能强大之处在于它的模板生态系统,这些模板定义了各种类型的漏洞检测逻辑。默认情况下,启动时会尝试更新本地模板数据库;然而也可以手动同步最新模板集: ```bash nuclei -update-templates ``` 这一步骤确保能够访问社区贡献的所有最新规则文件[^5]。 #### 执行基础扫描任务 假设有一个目标 URL 列表存储于名为 targets.txt 文件之中,下面展示了一个简单的扫描实例: ```bash nuclei -l targets.txt -t /path/to/templates/ ``` 其中 `-l` 参数指定输入源为目标列表模式,而 `-t` 参数则指定了要加载的模板目录位置。如果不提供具体路径,默认会选择内置通用类别下的所有可用模版进行匹配查找工作[^6]。 另外值得注意的是,当面对较大规模的目标集合或者复杂网络环境下可能产生的误报情况时,建议合理调整并发数量(`--threads`)以及其他高级选项参数设置来优化性能表现与准确性评估效果。 --- ### 提供代码片段示例 这里给出一段脚本形式调用 nuclei 并保存结果的例子: ```bash #!/bin/bash TARGETS="targets.txt" OUTPUT="results.json" echo "[*] Starting nuclei scan..." nuclei \ -l $TARGETS \ --json \ -o $OUTPUT echo "[+] Scan completed! Results saved into '$OUTPUT'." ``` 以上脚本实现了批量读取待测网址,并以 JSON 格式导出最终发现的结果记录功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值