首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86 Linux汇编程序从_start获取程序参数

x86 Linux汇编程序从_start获取程序参数
EN

Stack Overflow用户
提问于 2013-05-24 02:19:26
回答 1查看 14.1K关注 0票数 5

我正在尝试创建一个程序来编写屏幕上的参数。我创建了一些程序来获取C函数参数,或者我使用C将参数发送到我的asm程序。有没有办法只用汇编程序就能得到程序参数?

例如:

代码语言:javascript
复制
./Program "text"

我正在使用as (Gnu汇编程序)

通常我使用以下命令获取这些参数:

代码语言:javascript
复制
[esp+4]

因为esp是程序/函数调用指针,但在纯asm中它不获取命令行参数。

有没有办法做到这一点?

我用谷歌搜索了一下,但我找不到太多信息

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-24 04:06:49

在Linux上,来自C的熟悉的argcargv变量总是由内核在堆栈上传递,甚至对于完全独立且不与C库中的启动代码链接的汇编程序也是可用的。i386 System V ABI中记录了这一点,以及进程启动环境的其他详细信息(寄存器值、堆栈对齐)。

在ELF入口点(也称为x86 Linux可执行文件的_start):

  1. ESP指向argc
  2. ESP +4,指向数组的开始位置argv[0]。也就是说,应该作为char **argv传递给main的值是lea eax, [esp+4],而不是mov eax, [esp+4])

最小汇编程序如何获得argc和argv

我将展示如何在GDB中读取argvargc[0]

cmdline-x86.S

代码语言:javascript
复制
#include <sys/syscall.h>

    .global _start
_start:
    /* Cause a breakpoint trap */
    int $0x03

    /* exit_group(0) */
    mov $SYS_exit_group, %eax
    mov $0, %ebx
    int $0x80

cmdline-x86.gdb

代码语言:javascript
复制
set confirm off
file cmdline-x86
run
# We'll regain control here after the breakpoint trap
printf "argc: %d\n", *(int*)$esp
printf "argv[0]: %s\n",  ((char**)($esp + 4))[0]
quit

示例会话

代码语言:javascript
复制
$ cc -nostdlib -g3 -m32 cmdline-x86.S -o cmdline-x86
$ gdb -q -x cmdline-x86.gdb cmdline-x86
<...>  
Program received signal SIGTRAP, Trace/breakpoint trap.
_start () at cmdline-x86.S:8
8   mov $SYS_exit_group, %eax
argc: 1
argv[0]: /home/scottt/Dropbox/stackoverflow/cmdline-x86

解释

在ELF入口点(_start).

  • I之后,我放置了一个软件断点(
  • int $0x03)以使程序返回到调试器中,然后使用GDB脚本中的printf,使用带有表达式((char**)($esp + 4))[0]

的表达式*(int*)$esp

  • argv输出
  1. argc

x86-64版本

差异是最小的:

使用RSP

  • Change地址大小为4到8的
  • 替换ESP当我们调用exit_group(0)以正确终止进程

时,

  • 符合不同的Linux syscall调用约定

cmdline.S

代码语言:javascript
复制
#include <sys/syscall.h>

    .global _start
_start:
    /* Cause a breakpoint trap */
    int $0x03

    /* exit_group(0) */
    mov $SYS_exit_group, %rax
    mov $0, %rdi
    syscall

cmdline.gdb

代码语言:javascript
复制
set confirm off
file cmdline
run
printf "argc: %d\n", *(int*)$rsp
printf "argv[0]: %s\n",  ((char**)($rsp + 8))[0]
quit

普通C程序如何获取argc和argv

您可以从常规C程序中反汇编_start,以查看它如何从堆栈中获取argcargv,并在调用__libc_start_main时传递它们。以我的x86-64计算机上的/bin/true程序为例:

代码语言:javascript
复制
$ gdb -q /bin/true
Reading symbols from /usr/bin/true...Reading symbols from /usr/lib/debug/usr/bin/true.debug...done.
done.
(gdb) disassemble _start
Dump of assembler code for function _start:
   0x0000000000401580 <+0>: xor    %ebp,%ebp
   0x0000000000401582 <+2>: mov    %rdx,%r9
   0x0000000000401585 <+5>: pop    %rsi
   0x0000000000401586 <+6>: mov    %rsp,%rdx
   0x0000000000401589 <+9>: and    $0xfffffffffffffff0,%rsp
   0x000000000040158d <+13>:    push   %rax
   0x000000000040158e <+14>:    push   %rsp
   0x000000000040158f <+15>:    mov    $0x404040,%r8
   0x0000000000401596 <+22>:    mov    $0x403fb0,%rcx
   0x000000000040159d <+29>:    mov    $0x4014c0,%rdi
   0x00000000004015a4 <+36>:    callq  0x401310 <__libc_start_main@plt>
   0x00000000004015a9 <+41>:    hlt    
   0x00000000004015aa <+42>:    xchg   %ax,%ax
   0x00000000004015ac <+44>:    nopl   0x0(%rax)

__libc_start_main()的前三个参数是:

指向main()

  • RSIargc的指针,你可以看到它是如何从stack

  • RDXargv中弹出的,在argc被弹出之后,RSP的值。(GLIBC源中的ubp_av)

x86 _start非常类似:

代码语言:javascript
复制
Dump of assembler code for function _start:
   0x0804842c <+0>: xor    %ebp,%ebp
   0x0804842e <+2>: pop    %esi
   0x0804842f <+3>: mov    %esp,%ecx
   0x08048431 <+5>: and    $0xfffffff0,%esp
   0x08048434 <+8>: push   %eax
   0x08048435 <+9>: push   %esp
   0x08048436 <+10>:    push   %edx
   0x08048437 <+11>:    push   $0x80485e0
   0x0804843c <+16>:    push   $0x8048570
   0x08048441 <+21>:    push   %ecx
   0x08048442 <+22>:    push   %esi
   0x08048443 <+23>:    push   $0x80483d0
   0x08048448 <+28>:    call   0x80483b0 <__libc_start_main@plt>
   0x0804844d <+33>:    hlt    
   0x0804844e <+34>:    xchg   %ax,%ax
End of assembler dump.
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16721164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档