gcc内嵌汇编定义字符串

3

我将尝试为您翻译与IT技术相关的内容。以下是需要翻译的文本:

我试图定义一个位于.text节之外的字符串。它编译时没有错误,但当我使用gdb反汇编时,我得到了错误指令。 这是C代码:

void main(){
    __asm__(
            "jmp .+0x35;"
            "pop %rsi;"
            "mov %rsi, -0x10(%rsi);"
            "movq $0x0,-0x8(%rsi);"
            "mov -0x10(%rsi), %rax;"
            "lea -0x10(%rsi), %rcx;"
            "mov $0x0, %edx;"
            "mov %rcx, %rsi;"
            "mov %rax, %rdi;"
            "mov $0x3b,%eax;"
            "syscall;"
            "mov $0x0,%ebx;"
            "mov $0x1,%eax;"
            "syscall;"
            "call .-0x33;"
            ".string \"/bin/bash\";"
    );

}

反汇编 :

   0x0000000000400494 <+0>:     push   %rbp
   0x0000000000400495 <+1>:     mov    %rsp,%rbp
   0x0000000000400498 <+4>:     jmp    0x4004cd <main+57>
   0x000000000040049a <+6>:     pop    %rsi
   0x000000000040049b <+7>:     mov    %rsi,-0x10(%rsi)
   0x000000000040049f <+11>:    movq   $0x0,-0x8(%rsi)
   0x00000000004004a7 <+19>:    mov    -0x10(%rsi),%rax
   0x00000000004004ab <+23>:    lea    -0x10(%rsi),%rcx
   0x00000000004004af <+27>:    mov    $0x0,%edx
   0x00000000004004b4 <+32>:    mov    %rcx,%rsi
   0x00000000004004b7 <+35>:    mov    %rax,%rdi
   0x00000000004004ba <+38>:    mov    $0x3b,%eax
   0x00000000004004bf <+43>:    syscall
   0x00000000004004c1 <+45>:    mov    $0x0,%ebx
   0x00000000004004c6 <+50>:    mov    $0x1,%eax
   0x00000000004004cb <+55>:    syscall
   0x00000000004004cd <+57>:    callq  0x40049a <main+6>
   0x00000000004004d2 <+62>:    (bad) ( **here is define string** )
   0x00000000004004d3 <+63>:    (bad)
   0x00000000004004d4 <+64>:    imul   $0x68736162,0x2f(%rsi),%ebp
   0x00000000004004db <+71>:    add    %cl,%cl
   0x00000000004004dd <+73>:    retq

我该如何避免这个错误?

1
我不会真的称之为C语言。 - Fiddling Bits
1
你是否预期将"/bin/bash"的编码解析为有意义的内容? - Leeor
我期望获取 "/bin/bash" 的地址(在内存中的某个位置)。 - kokichi88
1个回答

3
   0x00000000004004cd <+57>:    callq  0x40049a <main+6>
   0x00000000004004d2 <+62>:    (bad) ( **here is define string** )
   0x00000000004004d3 <+63>:    (bad)

如何避免这个错误?
如果你不想在代码的 .text 部分直接出现字符串数据,那么你可以使用 .section 指令切换到 .data 部分,存储字符串,然后(可选)再次切换回 .text ,以便在更多内联的 asm 代码中使用数据的地址。
        "call .-0x33;"
        ".section .data;"
        "1: .string \"/bin/bash\";"

这在Defining Bytes in GCC Inline Assembly in Dev-C++(.ascii in AT&T syntax on Windows)的被接受的回答中有很好地描述。

非常感谢你,你真的救了我的一天。 - kokichi88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接