Articles of 反汇编

给定c ++行的转储程序集

说我有这样的代码(请注意,在编辑器中,我可以看到行号) //File example_optimization.cpp #1 int spreadi = (d_ai – d_bi); #2 int transactionCosti = spreadi / (spreadi < 10 ? 1 : 10); 如果编译器是一个优化编译器,并且设置了正确的标志,我想向自己certificate除1之外的事实并没有发生。 在linux中是否有一个工具(或者可以通过pipe道使用的工具的组合),我可以这样说: ctoassembler -c g++ -l 1 2 example_optimization.cpp 所以这个命令说,叫ctoassembler使用编译器和链接器gnu g ++,并且dump c ++文件example_optimization.cpp的第1到第2行。 默认是输出汇编代码到标准输出。 我真的不在乎用法是什么。 我感兴趣的是能够看到我的代码是由编译器转换成的,而不必自己search。 我不介意使用目标文件,如果这使得它更容易,但不知何故,最好显示c + +源代码和相应的汇编代码“并排”。

objdump和udis86在拆卸/ proc / kcore时产生不同的输出

我需要在Linux中反汇编/proc/kcore文件,我需要获得一些特殊指令的虚拟地址,以便稍后放置kprobes 。 根据这个文件 /proc/kcore是一个物理内存的映像,但在这个问题上有人回答说,它是内核的虚拟内存(正是我所期待的)。 当我使用objdump工具进行反汇编时,它的地址从f7c0b000开始,但是udis86从0x0开始(和完全不同的指令)。 当我尝试grep一些特定的指令,让我们说mov 0xf7c1d60c,%edx ,我得到: objdump的 f7c0b022 mov 0xf7c1d60c,%edx udis86 290ec02a mov 0xf7c1d60c,%edx 它看起来像udis86和objdump之间的偏移总是0xbffff000 。 为什么这么奇怪的抵消 我怎样才能获得特定指令的虚拟地址? 我读过的地方是,这个内核被静态映射到虚拟地址0xc0000000 + 0x100000。 如果/proc/kcore是真正的物理映像,只有将objdump返回的地址加上0x100000才是正确的,我会得到虚拟地址?

为什么我的shellcode不能工作(在Linux中)?

我在下面写了一个小shellcode: #include <stdlib.h> int main() { __asm__("jmp calloffset\n" "poploffset: popl %%esi\n" "movl $1,%%eax\n" "movl $6,%%ebx\n" "int $0x80\n" "calloffset: call poploffset\n" ".string \"/bin/bash\"\n":::"esi"); exit(1); } 当shellcode工作时,它会返回6.实际上,上面的代码运行良好,主函数确实返回了6。 然后我将代码embedded到C程序中: #include <stdlib.h> #include <unistd.h> char shellcode[]="\xeb\x0d\x5e\xb8\x01\x00\x00\x00\xbb\x06\x00\x00\x00\xcd\x80\xe8\xee\xff\xff\xff"; void func() { int * ret; ret=(int *)&ret+0x08; *ret=(int *)shellcode; } int main() { func(); exit(0); } 在正常情况下,代码应该返回6.但是它一直返回0。 我不认为我的代码是错的。 我会告诉你的。 首先,我从gdb得到val ret的地址: (gdb) […]

Linux 32位反汇编调用指令到下一个字节

我正在为32位和64位Linux操作系统创build驱动程序。 其中一个要求就是所有的代码都需要自己包含,而且没有任何呼叫。 在64位我没有问题,但在32位GCC似乎添加到下一个字节的调用指令。 search了一下后,我发现这个链接: http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html 有没有办法在32位Linux上禁用这个function? 例如:32位拆卸: <testfunc>: 0: push %ebp 1: mov %esp, %ebp 3: call 4 <test_func+0x4> <…some operation on ebx as mentioned in the link above> 64位disassebmly: <testfunc>: 0: push %rbp 1: mov %rsp, %rbp 3: <…no call here> “testfunc”中根本没有调用。 即使那么为什么32位编译器添加这些“调用”指令? 任何帮助表示赞赏。

linux反编译器

我怎么才能写出一个简单的反汇编程序的Linux从划痕? 有没有libs使用? 我需要一些“正常工作”的东西。

在debugging剥离的程序时在gdb中加载一个伪造的debugging符号

我正在使用gdbdebugging剥离的程序。 (gdb) bt #0 0x00007fffcb443650 in fooSnprintf () from ./install.so.1 我知道第三个参数是格式sting: (gdb) print (char*)$rdx $9 = 0x7fffe8dd4050 "%u %s" 在真实debugging符号加载时,如何在断点处停止gdb show function args? Breakpoint 1, fooSnprintf (a=0, b=0, fmt=0x40060a "%u %s") at test.c:3 我知道关于hook-stop ,但它是全局的,并会触发任何断点。 这工作,但不方便: define hook-stop if $rip == fooSnprintf print (char*)$rdx end end

如何从调用导入地址表中找出函数名称?

我在advapi32.dll(特别是RegOpenKeyEx)中反汇编了一个函数。 我看到两个FF 15电话进入IAT: call dword [0x77dd13ec] 和 call dword [0x77dd15d4] 使用dumpbin我倾倒了DLL的导入,它表示导入地址表从77DD124C开始。 但0x77dd13ec不会出现在日志中。 1A0的相对地址也不出现在其中的任何地方。 显然这些地址显示出来与IAT中的地址完全没有关系。 是否可以知道这些调用点链接到哪些函数,而无需编写和运行实际调用API的testing程序? 有什么方法可以find它? 我相信链接器生成这些CALL指令,它们必须知道链接到哪个函数。

Objdump -S不显示Linux内核模块的源代码列表

我试图从我的内核模块debugging崩溃; 我试图获得源代码列表与输出的objdump,但它不列出。 有什么我失踪? mips-linux-objdump -S <filename.o> > temp

了解linux中的堆栈

我有一个小的(易受攻击的)C样本: #include <unistd.h> int main(int argc, char *argv[]) { char buff[100]; if(argc < 2) { printf("Syntax: %s <input string>\n", argv[0]); exit (0); } strcpy(buff, argv[1]); return 0; } 我编译它: gcc -o basic_overflow basic_overflow.c -fno-stack-protector -fno-builtin 当我用gdb打开这个程序时,反汇编看起来像这样: Dump of assembler code for function main: 0x08048424 <+0>: push ebp 0x08048425 <+1>: mov ebp,esp 0x08048427 <+3>: and esp,0xfffffff0 […]

ELF可执行文件的起点?

我用anjuta在lubuntu 12.10上编译下面的C程序 int main() { return 0; } 文件名是foobar 然后我打开terminal并写命令 ndisasm foobar -b 32 1>asm.txt (用32位指令选项反汇编foobar并将反汇编结果保存为asm.txt) 我打开asm.txt有很多0x0000和小姐可以理解的代码。 jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002的指令jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002似乎是ELF文件格式的签名。 (因为hex代码0x454c46是ascii中的'ELF') Linux可能会将此代码加载到内存中,并且不会跳转到0x00000000,因为没有可执行代码。 我在这里有问题。 我怎么知道起始地址的地址? 哪些代码可以忽略?(也许许多0x0000可以忽略,但还有什么?)