> Could not target platform: 'Java SE 11' using tool chain: 'JDK 8 (1.8)'
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪,因为我确实有 Java 11:
$ java --version
openjdk 11.0.8 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我在 ghidra 中反编译了一个文件,在反编译文件中看到了很多 CONCAT+RandomNumber!
它们是什么意思?
经过几天的努力,我想向社区询问:)
我有两个exe文件。两者大小相同且相当大(约 80MB)。
我设法使用 Cutter (Radare2 GUI) 反编译这些文件,但考虑到文件大小,几乎不可能遍历每一种方法。
使用十六进制编辑器(Hex Fiend),我设法获得应用补丁的每个偏移位置。现在我试图用 Cutter 找到这些偏移量来反编译这些位置。
问题是:如何?当我在 Cutter 中打开 Hexdump 时,似乎一切都未就位,我可能需要偏移。在 Cutter 的加载屏幕上设置偏移量似乎没有做任何事情。难道是我用错了?
例子:
妖魔
Offset Hex Data Text
474942-474956 47 65 74 4D 6F 64 75 6C 65 48 61 6E 64 6C 65 41 GetModuleHandleA
Run Code Online (Sandbox Code Playgroud)
刀具
Offset Hex Data Text
0x0060713E-0x0060714D 47 65 74 4D 6F 64 75 6C 65 48 61 6E 64 6C 65 41 GetModuleHandleA
Run Code Online (Sandbox Code Playgroud)
474942是0x73F3E,但是距离0x0060713E很远
也许我需要其他工具?任何帮助表示赞赏!
我一直在使用 Ghidra 反编译一些最初为 ARMv7 编译的 .o 库文件,其中我有一些函数和结构的头文件。
假设一个结构体有几个单字节“char”成员:
struct myStruct {
char memberA;
char memberB;
char memberC;
char memberD;
} structInstance;
Run Code Online (Sandbox Code Playgroud)
如果汇编代码(可能是在构建时通过编译器优化)偷工减料并一次性访问整个 32 位字的字符,那么反编译的 C 代码将表示为:
structInstance._0_4_
Run Code Online (Sandbox Code Playgroud)
第一个数字 (0) 是起始字节的偏移量,第二个数字 (4) 是正在访问的字节数。
然而,据我所知,这是非标准的并且不会重新编译 - 至少在 GCC 中不会,而且我在任何地方都找不到任何对此表示法的引用。
有什么方法可以将 Ghidra 设置为生成实际上有效的反编译代码 - 即
*(uint32_t)&structInstance.memberA
Run Code Online (Sandbox Code Playgroud) 我正在尝试用 ghidra 来破解。我已经能够找到答案,但我想知道当我使用调试器并查看字符串时,我将如何“正确”地完成此操作。在下图中你可以明显地看到有很多 thunk 函数,但老实说对我来说它们看起来就像 printf 的函数。我不知道如何修复它,以便我可以获得实际可读的函数名称,或者如果没有办法的话。
我认为这可能与我尝试分析文件时遇到的错误有关,我收到有关 PDB 文件的错误。我尝试重新编译 msdia140.dll,因为我使用的是 Visual Studio 2019,但当我尝试这样做时,我刚刚遇到了构建错误。
TL;DR 我该如何制作才能使下面的图像不充满 thunk 函数,并且实际上可以以某种方式读取,就像那些看起来像 printf 函数一样。
我正在反转这个 Android 应用程序以用于学习目的,并且该应用程序在本机层上实现了所有有趣的功能,因此我在 Arm Android Studio 映像上运行该应用程序并反转了共享库。因此该应用程序正在使用 ghidra 进行调用我设法将共享对象反编译成c,我发现了很多相互调用的函数,而且我还发现了尊重jni命名约定的函数
我可以成功挂钩任何上述导出,但是当我尝试挂钩以下函数时,我得到一个未找到的导出,如何挂钩这些本机函数?
在分析 Ghidra 中的程序集列表时,我偶然发现了这条指令:
CALL dword ptr [EBX*0x4 + 0x402ac0]=>DAT_00402abc
我假设程序正在调用一个地址位于 inside 的函数DAT_00402abc
,我最初认为它是一个双字变量。事实上,当尝试在 is 所在的位置创建函数时DAT_00402abc
,Ghidra 不会让我这样做。
反编译器向我显示这行代码来翻译该指令:
(*(code *)(&int2)[iVar2])();
所以我想知道这是什么意思以及程序应该用这个调用做什么?有没有可能吉德拉彻底搞砸了?如果是这样,我应该如何解释该指令?
这是缓冲区溢出的二进制文件的摘录。我用 Ghidra 反编译了它。
char local_7 [32];
long local_78;
printf("Give it a try");
gets(local_7);
if (local_78 != 0x4141414141414141) {
if (local_78 == 0x1122334455667788) {
puts ("That's won")
}
puts("Let's continue");
}
Run Code Online (Sandbox Code Playgroud)
我想了解为什么可能会发生缓冲区溢出。
我检查了“0x4141414141414141”十六进制值,发现它与“A”字符串有关。但是与“0x4141414141414141”和“0x1122334455667788”相关的条件究竟是做什么的?更准确地说,用户可以回答什么来获得消息(“那是赢了”)?
任何解释将不胜感激,谢谢!
___EDIT ___
我必须补充一点,我在使用“disas main”命令时看到了这两个十六进制值:
0x00000000000011a7 <+8>: movabs $0x4141414141414141,%rax
0x00000000000011e6 <+71>: movabs $0x4141414141414141,%rax
0x00000000000011f6 <+87>: movabs $0x1122334455667788,%rax
Run Code Online (Sandbox Code Playgroud)
我尝试使用python3 -c "print ('A' * 32 +'\x88\x77\x66\x55\x44\x33\x22\x11')" | ./ myBinary
.
但我总是有"Let's continue"
消息。我离解决方案不远了,但我想我错过了一件事..你能帮我什么吗?
___EDIT 2 ___ 在获取之前:
char local_7 [40];
long local_78;
local_78 = 0x4141414141414141;
printf("Give it a …
Run Code Online (Sandbox Code Playgroud) ghidra ×9
c ×3
decompiling ×2
android ×1
binary ×1
c++ ×1
decompiler ×1
disassembly ×1
frida ×1
gradle ×1
hexdump ×1
java ×1
radare2 ×1
x86 ×1