问题标签 [dynamic-analysis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
memory - 使用 Intel 的 PinTool 获取堆栈指针内容
使用 objdump 实用程序,我们能够检索变量的相对地址,例如考虑一个简单的 C 程序:源代码:
使用 gcc 编译:
$ gcc -g 示例.c -o 示例
运行带有 dwarf 标志的 objdump 实用程序以获取 ELF 信息。
$objdump --dwarf=info 示例
输出:
我想做如下: -
- 我想检索一个变量的地址,比如 my_local。首先,我将查看 DW_TAG_Variable,然后查看 DW_AT_name、DW_AT_location,它们由基址寄存器从顶部的函数 -20 处给出。
问题:如何在运行时知道基址寄存器的内容。我们可以使用 PinTool 来实现它吗?
更广泛意义上的问题:我想要变量 my_local 映射到内存中的哪个地址给定来自 dwarf 和 Pintool 的信息。
提前致谢。
c - 如何使用 GDB 反向调试通过函数调用跟踪值传播?
我试图找出一种方法来使用 GDB 反向调试在程序中通过函数调用和变量副本来跟踪值的传播。我过去经常使用 GDB,但对反向调试相对较新。
我认为用一个例子来描述这个问题是最容易的。看看这个程序。
我编译程序,然后使用反向调试启动 GDB 以运行编译后的可执行文件。printf
我在in处设置了一个断点FnA
,然后让程序开始执行,这导致我命中了那个断点。从这里,我想回答“最后一次x
写信到哪里?”这个问题。我可以做一个watch -l x
然后reverse-continue
。然而,这只会把我带到 的开头FnA
,因为那是x
它在堆栈上的生命周期开始的地方。我真正感兴趣的是i = 5
一路回溯的赋值,main
因为那是x
's 价值的来源。从i = 5
发生的那一刻起,真正的价值x
只是通过函数参数和变量副本传播,如下所示:main:i -> FnC:z -> FnB:y -> FnB:y_copy -> FnA:x
.
显然,我可以通过一些 GDB-fu 结合人类直觉来解决这个问题,但我正在努力使这个过程尽可能自动化。我最终想在更复杂的软件中尝试这个,使用人类直觉和 GDB-fu 会相当乏味。
有没有一种方便的方法可以通过反向调试在 GDB 中完成此任务?GDB 是否能够自动找出并遵循这些价值传播?
PS:具体来说,我实际上是在使用 GDB 和rr。rr 只是 gdb 的一个包装器,以允许确定性和可重现的执行上下文。我认为/希望核心问题保持不变,无论我是否使用带或不带 rr 的 gdb。
c# - 通过应用程序代码和系统库跟踪数据输入
我是一名安全人员,我已经对此进行了广泛的研究,此时我正在寻找下一步该去哪里的指导。
另外,对不起,很长的帖子,我把重要的部分加粗了。
我试图在高层次上做的事情很简单: 我试图将一些数据输入到程序中,并“跟踪”这些数据,并跟踪它是如何处理的,以及它在哪里结束。
例如,如果我将我的登录凭据输入到 FileZilla,我想跟踪访问的每个内存引用,并启动跟踪以跟踪该数据的去向、发送到哪些库,如果我什至可以将其关联到网络数据包。
现在我专注于 Windows 平台,我认为我的主要问题归结为: 是否有任何好的 API 可以远程控制理解 Windows 窗体和系统库的调试器?
以下是我迄今为止发现的关键属性:
- 这种分析技术的名称是“动态污点分析”
- 这将需要调试器或分析器
- Inspect.exe 是查找接受输入的 Windows UI 元素的有用工具
- Windows 自动化框架通常可能有用
- 自动化调试器似乎很痛苦。IDebugClient 接口允许更丰富的数据,但像 IDAPro 甚至 CheatEngine 这样的调试器具有更好的内存分析实用程序
- 我将需要放置内存断点,并跟踪与输入关联的引用和寄存器。
以下是我尝试过的一系列工具:
我玩过以下所有工具:WinDBG(很棒的工具)、IDA Pro、CheatEngine、x64dbg、vdb(python 调试器)、Intel 的 PIN、Valgrind 等...
接下来是一些动态污染分析工具,但它们不支持检测 .NET 组件或 Windows 调试框架提供的其他便利,这些便利由 Inspect.exe 等实用程序提供:
然后我尝试使用 IDebugClient 接口编写我自己的 C# 程序,但是它的文档记录很差,我能找到的最好的项目来自这个家伙,并且已经 3 岁了: C# app to act like WINDBG's "step into" feature
我愿意为适合此用例的现有项目贡献代码,但此时我什至不知道从哪里开始。
我觉得作为一个整体的动态程序分析和调试工具可以使用一些爱......我觉得有点卡住了,不知道从哪里开始。有很多不同的工具和方法可以解决这个问题,而所有这些工具和方法都以某种方式缺乏另一种。
无论如何,我感谢任何方向或指导。如果你能做到这一点,谢谢!!
-戴夫
analysis - 程序分析 - 通过路径加入与通过路径相遇
MOP和JOP是程序分析中常用的概念。据我所知,MOP 上升,JOP 下降。但是,我仍然需要两者的可靠定义+解释(和应用程序)。任何答案将不胜感激。
c++ - 在单元测试中检测特定的函数调用
我希望能够检测我的函数(或它调用的任何其他函数)是否最终会在我的单元测试中调用某些特定函数(例如,malloc
和free
):我的软件的一些小部分具有硬实时要求,并且我想确保没有人在这些函数中添加会意外触发分配的内容(并让我的 CI 管道自动检查它)。
我知道我可以在 gdb 上放一个断点,但理想情况下我想做类似的事情:
std::abort
理想情况下,如果在两次检查之间调用了 malloc ,则测试将以不太脏的方式(例如 not )失败。
理想情况下,这可以在任何系统上运行,但我现在可以接受只能在 linux 上运行的东西。这在某种程度上可能吗?也许通过替换 LD_PRELOAD hack malloc
,但我宁愿不必为我感兴趣的所有功能这样做。
memory - while loop-Polyspace 可能出现运行时错误
我正在使用嵌入式 C 语言,最近为整个项目运行 MathWorks Polyspace Code Prover(动态分析)以检查关键的运行时错误。它在 While 循环中发现了一个错误(红色警告),我通过内存寄存器将一些 ROM 数据复制到 RAM 中。该代码工作正常且符合预期,但我想问是否有任何解决方案可以安全地删除此警告。请在下面找到代码示例:
我的猜测是 ADDR_SWR4_BEGIN 和 ADDR_ARAM_BEGIN 是在链接器脚本中定义的,而 polyspace 没有编译和链接项目,这就是它抱怨可能的运行时错误或无限循环的原因。
ADDR_SWR4_BEGIN 和 ADDR_ARAM_BEGIN 在各自的头文件中定义为 extern。
警告为红色,具体警告如下:
任何建议,将不胜感激。
c - 模拟 C 程序的服务器端 GET 请求
我目前正在研究一个已编译的 C 程序。我知道由于多次调用socket
,gethostbyname
并connect
贯穿整个代码,它会发出多个网络请求。此外,我知道它正在发出GET
请求,因为我已经strings
在程序上运行并找到了一个。
我想运行这个程序,这样我就可以在不进行任何网络调用的情况下对其进行调查;但是要做到这一点,我必须只使用给定的函数来模拟获取请求。
我有以下代码,我已编译并添加到LD_PRELOAD
:
这似乎可行,但我无法理解它打印到套接字和从套接字接收的内容。
我也对这个问题的其他解决方案持开放态度。
security - 我可以进行二进制污点分析吗?
我想分析以下二进制文件。
我已经尝试过Triton,但是诸如 movl (movq) 之类的内存访问指令没有被反汇编并且分析失败。
我想知道如何输出可以被 Triton 或其他污点分析工具分析的二进制文件。
源代码(我使用 clang 编译。)
Triton 的代码如下。
错误如下。
x86 - PolyBench Suite 的 x86 反汇编中的浮点指令
我正在尝试使用 pin 工具计算由 GCC 为来自 poly bench 基准测试的 30 个不同程序创建的二进制文件中 CPU 执行的动态浮点指令的数量。根据 x86 编码器-解码器 (XED) 文档,x86 中的所有浮动指令都属于 X87_ALU 类别。
出于某种原因,我将所有程序的它都设为零,这与二进制、加载、存储、nop 等所有其他指令类别不同。我使用 objdump 对二进制文件进行了反汇编,并且看不到带有操作码开始的单行从 f.
此外,我使用 emscripten (emcc) 为所有程序生成了 Web 程序集 (.wasm) 二进制文件,然后将 .wasm 二进制文件转换为反汇编的 .wat 文件。在这些文件中,我也没有看到任何浮点指令。
PS:从我一直在做的谷歌搜索中,我了解到 x86 对这些具有完全不同的浮点单元和基于堆栈的处理。也许我在这方面遗漏了一些东西?
关于如何查看反汇编二进制文件中的浮点指令的任何线索?