- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写简单的程序,然后对其进行分析。今天我写了这个:
#include <stdio.h>
int x;
int main(void){
printf("Enter X:\n");
scanf("%d",&x);
printf("You enter %d...\n",x);
return 0;
}
编译成这样:
push rbp
mov rbp, rsp
lea rdi, s ; "Enter X:"
call _puts
lea rsi, x
lea rdi, aD ; "%d"
mov eax, 0
call ___isoc99_scanf
mov eax, cs:x <- don't understand this
mov esi, eax
lea rdi, format ; "You enter %d...\n"
mov eax, 0
call _printf
mov eax, 0
pop rbp
retn
我不明白cs:x
是什么意思。
我使用 Ubuntu x64、GCC 10.3.0 和 IDA pro 7.6。
最佳答案
TL:DR:IDA 混淆地使用 cs:
来指示 64 位代码中的 RIP 相对寻址模式。
在 IDA 中,mov eax, x
表示 mov eax, DWORD [x]
,这反过来意味着从变量 x
中读取一个 DWORD。
为了完整起见,mov rax, OFFSET x
表示mov rax, x
(即将x
的地址放入rax
).
在 64 位中,位移仍然是 32 位的,因此,对于位置无关的可执行文件,并不总是可以通过对其地址进行编码来寻址变量(因为它是 64 位的,不适合 32 位的 field )。而在与位置无关的代码中,这是不可取的。
相反,RIP-relative addressing被使用。
在 NASM 中,RIP 相对寻址的形式为 mov eax, [REL x]
,在 gas 中为 mov x(%rip), %eax
。< br/>此外,在 NASM 中,如果 DEFAULT REL
处于事件状态,则指令可以缩短为 mov eax, [x]
,这与 32 位语法相同。
每个反汇编器都会以不同的方式反汇编 RIP 相关的操作数。正如您评论的那样,Ghidra 给出了mov eax, DWORD PTR [x]
。
IDA 使用 mov eax, cs:x
表示 mov eax, [REL x]
/mov x(%rip), %eax
.
;IDA listing, 64-bit code
mov eax, x ;This is mov eax, [x] in NASM and most likely wrong unless your exec is not PIE and always loaded <= 4GiB
mov eax, cs:x ;This is mov eax, [REL x] in NASM and idiomatic to 64-bit programs
简而言之,您几乎可以忽略 cs:
,因为这正是 64 位模式下变量的寻址方式。
当然,如上面的 list 所示,使用或不使用 RIP 相对寻址告诉您程序可以加载到任何地方或略低于 4GiB。
IDA 显示的 cs
前缀让我失望。
我可以看出它在心理上类似于“代码”,因此类似于 rip
寄存器,但我认为 RIP 相对寻址并不意味着 cs
段覆盖。
在32位模式下,代码段通常是只读的,所以像mov [cs:x], eax
这样的指令会报错。
在这种情况下,将 cs:
放在操作数前面是错误的。
在 64 位模式下,段覆盖(fs
/gs
除外)被忽略(以及代码的读取位segment 无论如何都会被忽略),所以 cs:
的存在并不重要,因为 ds
和 cs
实际上是无法区分的。 (即使 ss
或 ds
覆盖也不会更改非规范地址的 #GP 或 #SS 异常。)
可能 AGU 甚至不再为 fs
或 gs
以外的段基址读取段影子寄存器。 (虽然即使在 32 位模式下,对于段基数 = 0 的正常情况也有一条延迟较低的快速路径,因此硬件可能只是让它完成它的工作。)
在我看来 cs:
仍然具有误导性 - 2E
前缀字节在机器代码中仍然可能作为填充。尽管http://ref.x86asm.net/coder64.html,大多数工具仍将其称为 CS 前缀。在 64 位模式下称其为“空前缀”。这里没有这样的字节,cs:
不是暗示 RIP 相对寻址的明显或明确的方式。
关于assembly - CS : override on access to global variables in IDA output, 像 mov eax, cs :x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68702174/
我正在使用 IDA pro 来分析软件二进制文件。有时,一些函数以 sp-analysis 失败告终。我正在用 IDAPython 编写程序。是否有任何 API 可以检测这种情况,所以我现在可以忽略那
我使用IDA Pro发现了一个特别重要的功能。然而,来源非常大,我相信我很快就会失去它的踪迹。 有没有办法将函数“标记”为重要、用颜色编码或类似的方法? 最佳答案 您可以使用: 编辑函数并将其公开 编
我正在尝试反汇编 68000 的 BIOS 镜像,但无法让 IDA Pro 6.5 正确交叉引用地址。 对于那些不知道的人来说,摩托罗拉 68000 有一些与寻址相关的有趣功能/怪癖: 当给定 16
我想在使用 wine 的 linux 上使用 Windows 版本的 IDA。但是,Ubuntu运行IDA pro结果无法加载idapython,左下角一直显示IDC。IDA pro显示如下: Loa
如何在 IDA 6.1 的程序集 View 中禁用图形模式?我所说的图形模式是指这个 我看到选项 -> 图表 -> 默认使用图 TableView ,但取消选中它没有帮助:(( 最佳答案 要在适用图
我将 ida* 用于 8 拼图,我的 friend 也使用了 a*(具有相同的曼哈顿距离 huristic)。 我计算了 20 个示例的算法和我 friend 的算法的平均值,我的算法的平均时间比我
有人知道怎么做吗? Using File>加载C头文件失败错误代码太多。 最佳答案 C++ 标准库中有太多 IDA 无法理解的编译器相关宏。由于许多原始数据类型,例如 uint32_t 等,已经被 I
当一个结构被 malloc 时,这个结构有多大是显而易见的。然而,为 256 字节的结构声明 64 个虚拟双字字段是非常乏味的。将结构声明为具有固定大小的数组并没有太大帮助,因为您不能单独命名元素。目
我们有一个DLL,我们已经失去了它的来源,因此我试图通过IDA Dissembler弄清楚它是如何工作的。但是似乎有一些我无法访问的函数,因为出现以下错误: Decompilation failure
最近我尝试在 ida pro 6.1 中进行反编译,但 ida 输出的结果不正确,因为我反编译的函数我只收到此代码: int result; // eax@1 return result; 对于我反编
该程序在我的机器上以 root 权限运行,我需要对以下代码执行堆栈溢出攻击并获得 root 权限: #include #include #include #include #include
我们需要为一些自定义中间语言代码创建一个 CFG。我们目前正在使用 Qt + graphviz - CFG 看起来像个屁股。 具体来说,我们似乎无法弄清楚我们该如何做 将“流”(从上到下)获取到图中,
我已经使用 LordPE 从内存中转储了一个 dll,到目前为止一切顺利,但是 IDA 显示了一些函数,如下所示: call off_11CAE08 在内存地址11CAE08(.data部分),
谁能告诉我如何使用IDC以批处理模式输出所有子例程的图表。即,我有 447 个子例程,想要将它们全部输出,并且我想确保我首先自动检索所有例程地址,因为通过知道地址,我可以简单地使用 GenFuncCa
谁能告诉我如何使用IDC以批处理模式输出所有子例程的图表。即,我有 447 个子例程,想要将它们全部输出,并且我想确保我首先自动检索所有例程地址,因为通过知道地址,我可以简单地使用 GenFuncCa
过去几周我一直在研究 ida Pro,以了解一些背景知识。 长期以来一直困扰我的事情是似乎缺乏对提取导入函数的支持。 我想要的只是一个可以复制整个导入窗口并粘贴到文本文件中的脚本,但我在 API 中找
我一直在尝试反转一个 Mach-O 可执行 arm 文件,我能够在 iOS 的 gdb 中很好地调试它,而且二进制文件似乎没有被剥离为 gdb显示函数名称等;然而,当我将二进制文件弹出到 IDA 中时
在 Wikipedia pseudocode 之后,我正在努力用 Python 实现 IDA* 算法(我是新手) . 你能解释一下我应该在这一行检查什么吗: if t = ∞ then return
我试图在屏幕 session 中运行 idal64 (IDA pro),但我收到此错误: TVision error: Can not load libcurses.so Without li
当我用 IDA 分析二进制文件时,我看到了以下函数: Function::Function(void *, unsigned int, void *, unsigned int) 因此,如您所见,ID
我是一名优秀的程序员,十分优秀!