我的代码如下:
#include <stdio.h>
int g_a;
int g_b;
int g_c;
int main()
{
printf("Hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并用 gcc 构建它
gcc -o global global.c
Run Code Online (Sandbox Code Playgroud)
最后,我使用 objdump 查看全局变量的地址
objdump -t global
Run Code Online (Sandbox Code Playgroud)
并查看结果:
00004020 g_b
00004024 g_a
00004028 g_c
Run Code Online (Sandbox Code Playgroud)
为什么全局变量存储在像上面这样的地址中?我的意思是全局变量应该按 g_a、g_b、g_c 的顺序存储
我想使用"otool"或"objdump"打印在 iOS 二进制文件中找到的所有 Objective-C 类的名称。我在 macOS 上的未加密的 iOS 二进制文件上执行此操作。
我尝试过的:
otool -oV /path to executable/ | grep name | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)
但我不知道如何只解析 Objective-C 类名。
nm /path to executable/ | grep _OBJC_CLASS_
Run Code Online (Sandbox Code Playgroud)
你们能帮我用 cmd/脚本来打印 iOS 二进制文件中所有 Objective-C 类的名称吗?
通过使用该命令,我发现内存中的objdump地址包含 start the path ,并且由于 C 标准,该路径以一个字节结束。0x02a8/lib64/ld-linux-x86-64.so.20x00
因此,我尝试编写一个简单的 C 程序来打印这一行(我使用了 Denis Yurichev 所著的《RE for Beginners》一书中的示例 - 第 24 页):
#include <stdio.h>
int main(){
printf(0x02a8);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但我很失望地得到了分段错误而不是预期的/lib64/ld-linux-x86-64.so.2输出。
我发现使用这样一个printf不带说明符或至少不带指针转换的“快速”调用很奇怪,所以我尝试使代码更自然:
#include <stdio.h>
int main(){
char *p = (char*)0x02a8;
printf(p);
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行后我仍然遇到分段错误。
我不相信这是因为内存区域受限而发生的,因为在书中,第一次尝试一切都很顺利。我不确定,也许还有那本书中没有提到的事情。
因此,需要一些清晰的解释来解释为什么每次我尝试运行程序时都会发生分段错误。
我正在使用最新的完全升级的 Kali Linux 版本。
我有以下一段C代码:
#include <stdio.h>
int main()
{
int i;
for(i=0; i<10; i++)
puts("hello, friend");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我这样编译的:gcc firstprog.c -o firstprog
然后,当使用gdb拆卸它时,我看到:
(gdb) disassemble
Dump of assembler code for function main:
=> 0x0000555555555149 <+0>: endbr64
0x000055555555514d <+4>: push rbp
0x000055555555514e <+5>: mov rbp,rsp
0x0000555555555151 <+8>: sub rsp,0x10
0x0000555555555155 <+12>: mov DWORD PTR [rbp-0x4],0x0
0x000055555555515c <+19>: jmp 0x55555555516e <main+37>
0x000055555555515e <+21>: lea rdi,[rip+0xe9f] # 0x555555556004
0x0000555555555165 <+28>: call 0x555555555050 <puts@plt>
0x000055555555516a <+33>: add DWORD PTR [rbp-0x4],0x1
0x000055555555516e <+37>: cmp …Run Code Online (Sandbox Code Playgroud) 假设我有一个简单的可执行文件,我想找到 main 的地址。通常,我从输出中获取地址objdump,然后在pwn脚本中使用它。我想让我的脚本更加通用,而不使用objdump. 有什么办法可以用 pwn 做到这一点吗?
现在我正在尝试了解 RISC-V ISA,但我对机器代码和汇编有不清楚的地方。
我写了这样的C代码:
int main() {
return 42;
}
Run Code Online (Sandbox Code Playgroud)
然后,我通过以下命令生成了 .s 文件:
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -S 42.c
输出是:
.file "42.c"
.option nopic
.text
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-16
sd s0,8(sp)
addi s0,sp,16
li a5,42
mv a0,a5
ld s0,8(sp)
addi sp,sp,16
jr ra
.size main, .-main
.ident "GCC: (g5964b5cd727) 11.1.0"
.section .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)
现在,我运行以下命令来生成一个精灵。
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc -nostdlib -o 42 42.s
这样,就生成了一个二进制文件。我尝试通过 objdump 读取该内容,如下所示:
$ /opt/riscv/bin/riscv64-unknown-linux-gnu-objdump -d 42
所以输出是这样的:
42: file format elf64-littleriscv
Disassembly of section .text:
00000000000100b0 …Run Code Online (Sandbox Code Playgroud) 我正在反汇编和检查(主要是为了乐趣和学习)为 ESP8266 (Xtensa ISA) 生成的 Arduino 代码。
到目前为止,我一直在跟踪代码,没有出现任何问题,直到4010f4c2主函数中的大括号(位置):
4010f494 <main>:
4010f494: 90a092 movi a9, 144
4010f497: c01190 sub a1, a1, a9
4010f49a: 00a022 movi a2, 0
4010f49d: 236102 s32i a0, a1, 140
4010f4a0: 2261c2 s32i a12, a1, 136
4010f4a3: 2161d2 s32i a13, a1, 132
4010f4a6: ffc2c5 call0 4010f0d4 <print_version>
4010f4a9: 202110 or a2, a1, a1
4010f4ac: 001045 call0 4010f5b4 <eboot_command_read>
4010f4af: 00d256 bnez a2, 4010f4c0 <main+0x2c>
4010f4b2: 024c movi.n a2, 64
4010f4b4: fee101 l32r a0, 4010f038 <_stext+0x38>
4010f4b7: …Run Code Online (Sandbox Code Playgroud)