好的,所以基本上我想重用Linux 32bit上ELF的转储.rodatadatabss部分中的内容。

dump命令:
对于.bss部分,我准备重新使用一堆与00000000部分大小相同的bss

objdump -s -j .text elf_binary
objdump -s -j .rodata elf_binary
objdump -s -j .data elf_binary


但是基本上我的问题是:

如何在nasm汇编器中重复使用这些废弃的段? br />
基本上gas具有不同的组装样式,显然数据节的表示形式是不同的...

我尝试了好几次,但仍然找不到解决方案。 br />
我清楚地表明了我的问题吗?有人可以给我一些帮助吗?从另一个二进制文件转储的gasrodatadata部分。例如,这是bss部分的内容

.section rodata
S_label1: db 0x01
         db 0x02
         ....  
.section data
        db 0x01
S_label2:  db 0x02
         ....
.section bss
S_label3: db 0x00
         db 0x00
         ....

nasm -f elf test.s


,我可以重新以这种方式使用它:

03000000 01000200 0a0a556e 736f7274
65642061 72726179 2069733a 20200020
25642000 0a0a536f 72746564 20617272
61792069 733a2020 00


基本上在rodata中,我可以通过上述方式轻松地重复使用它们,但是我的问题是,如何重新

有可能吗?

以类似的方式在nasm中使用它(或直接使用gas)?

评论

重复使用到底是什么?请在此处描述您要解决的总体问题。

我相信发布者正在尝试在他/她编写的汇编程序中重用这些部分的内容。

@IgorSkochinsky嗨,我更新了问题。.

@yaspr嗨,我修改了问题...现在清楚了吗?

#1 楼

作为汇编程序员,我会说gas很少用于汇编外部代码。调用gas的任务通常留给编译器,而在现实生活中gas必须处理的大多数程序集要么是inlined内的C,要么是C++代码,或者来自编译器。但是,我相信Dean Elsner,Jay Fenlanson和他的朋友们撰写的这份文件是迄今为止我设法依靠的最佳参考。它已经更新了很多次,涵盖了2.19.51版本。

简单的方法是使用GCC,我会说:

  //Just to avoid make a point :]
  typedef unsigned char byte;

  //
  byte lbl1[] = { 0x03, 0x00, 0x00, 0x00, ... }, 
       lbl2[] = { 0x01, 0x00, 0x02, 0x00, ... };

  //I prefer Intel syntax rather than AT&T, it's somehow cleaner !
  __asm__("intel_syntax noprefix                 ;"
          "mov eax, %0                           ;"
          "mov ebx, %1                           ;"
          "att_syntax prefix                     ;"
          :                        //output
          : "r" (lbl1), "r" (lbl2) //input
          : "%eax", "%ebx");       //clobber


好吧,如果您想专注于汇编代码(这是我手动优化代码时的方式),这是一种不错的方法。

现在,让我解释一下。首先,您有两个包含检索到的数据的数组,没有花哨的地方。然后,您获得汇编代码。如果您不熟悉inlined汇编程序,尽管我将简要介绍一下我的代码,但我还是建议您使用此链接。
__asm__指令可让您在代码中的任何位置插入汇编程序指令。首先,我告诉汇编程序,我将使用Intel的语法(寄存器没有%前缀,...),然后在eax中移动寄存器%0的内容,然后在ebx中移动%1的内容( 0是lbl1的指针,%1是lbl2的指针)。然后,将其余参数切换为AT&T语法。在第一个之后:您可以指定输出变量。在第二个之后:您可以指定输入。在这里,我传递了lbl1和lbl2,并使用“ r”让编译器处理寄存器分配。如果您知道自己在做什么,则可以指定寄存器。在最后一个之后:您必须声明代码内使用的寄存器,以便编译器释放它们并将其用于其余的代码生成步骤。

#2 楼

感谢@yaspr的出色回答。 br />这是我的答案:

一旦转储了这些部分的所有内容,您就可以快速使用这种方式,我使用了一个hello world代码进行演示:

.section .text
.globl  main
main:
push   %ebp
mov    %esp,%ebp
and    q4312078qxfffffff0,%esp
sub    q4312078qx20,%esp
fldl   S_80484f0     // lift the conceret address into symbol
fstpl  0x18(%esp)
fldl   0x18(%esp)
fstpl  0x4(%esp)
movl   $S_80484e0,(%esp) // lift the conceret address into symbol
call   printf
leave
ret
nop
nop
nop

.section .rodata

S_80484e0:
.long 0x6c6c6568
.long 0x6f77206f
.long 0x20642c72
.long 0x000a6625

S_80484f0:
.long 0x00000000
.long 0x40240000


致@yaspr关于AT&T与Intel风格的对比: ,在我目前正在苦苦挣扎的当前项目中,我发现在一堆GNU工具(.rodata .data .bss等)中使用nasm可能不是很容易。可以以objdump样式拆卸,我仍然遇到很多问题/不清楚的问题,尤其是在比较了objcopyld之间的拆卸结果之后

评论


好吧,您必须记住,IDA和objdump不会以相同的方式(不是相同的算法)执行反汇编。 objdump使用线性扫描,这是一种静态反汇编技术,会产生错误的结果。尤其是当数据与指令(例如shellcode)混合在一起时。您不应该盲目使用任何工具,如果要提高效率,请交叉引用它们的输出。每个人都有其缺点和优势。我可以向您保证,将NASM与GNU工具一起使用不会影响您的工作,尽管这是您的最终选择。并且,使用多种工具是学习的好方法。

– Yaspr
2014年5月2日21:55

@yaspr谢谢您的回复!是的,我知道反汇编算法的区别,因此实际上在当前项目中,我尝试使用IDAPro,因为它被认为是最好的,但是,尽管它是一个出色的工具,但我仍然发现目标之间有些不匹配我们要实现并且IDAPro可以支持(反汇编二进制文件进行分析)。

– lllllllllllll
2014年5月2日在22:59

没有所谓的“最佳工具”。只有精明且有据可查的用户。 IDAPro提供了许多功能,可以帮助您执行出色的分析并恢复有关目标二进制文件的大量信息。关于IDAPro最有趣的是,它是可编写脚本的。多数其他工具并非如此。

– Yaspr
2014年5月3日在8:12