.rodata
,data
和bss
部分中的内容。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 />
我清楚地表明了我的问题吗?有人可以给我一些帮助吗?从另一个二进制文件转储的
gas
,rodata
和data
部分。例如,这是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
)?#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
样式拆卸,我仍然遇到很多问题/不清楚的问题,尤其是在比较了objcopy
和ld
之间的拆卸结果之后评论
好吧,您必须记住,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
评论
重复使用到底是什么?请在此处描述您要解决的总体问题。我相信发布者正在尝试在他/她编写的汇编程序中重用这些部分的内容。
@IgorSkochinsky嗨,我更新了问题。.
@yaspr嗨,我修改了问题...现在清楚了吗?