【问题标题】:gcc inline assembler define stringgcc 内联汇编器定义字符串
【发布时间】:2014-01-10 21:33:31
【问题描述】:

我尝试在 .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

我怎样才能避免这个错误?

【问题讨论】:

  • 我不会真的把它叫做 C。
  • 你是不是除了“/bin/bash”的编码反汇编成有意义的东西?
  • 我除了“/bin/bash”的地址(内存中某处)

标签: c string gcc assembly inline-assembly


【解决方案1】:
   0x00000000004004cd <+57>:    callq  0x40049a <main+6>
   0x00000000004004d2 <+62>:    (bad) ( **here is define string** )
   0x00000000004004d3 <+63>:    (bad)

我怎样才能避免这个错误?

如果您不希望字符串数据直接出现在代码 (.text) 部分中,则可以使用 .section 指令切换到 .data 部分,存储字符串,然后(可选)如果需要使用更多内联asm代码中的数据地址,请再次切换回.text

        "call .-0x33;"
        ".section .data;"
        "1: .string \"/bin/bash\";"

Defining Bytes in GCC Inline Assembly in Dev-C++(.ascii in AT&T syntax on Windows) 的接受回答很好地描述了这一点

【讨论】:

  • 非常感谢,你真的拯救了我的一天
猜你喜欢
  • 2012-10-20
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多