微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AT&T 32 位程序集在函数调用后是否推送字符串?

如何解决AT&T 32 位程序集在函数调用后是否推送字符串?

我目前正在尝试理解 AT&T 32 位汇编代码,我偶然发现了这些指令,并试图从中理解:

_start:
        jmp B

A:
   # fd = open("libtest.so.1.0",O_RDONLY);
   xorl %ecx,%ecx
   movb $5,%al
   popl %ebx
   xorl %ecx,%ecx
   int $0x80


B:
   call A
   .string "/lib/libtest.so.1.0"

A 持续了更长的时间,但没关系,我的问题在 B 内,如何在发出 call 指令后推送字符串?除了某种我不明白的参数传递之外,我没有看到字符串以 ebx 结尾的任何方式。

解决方法

call 将返回地址压入堆栈,即 call 后面的地址,这将是此处路径字符串的地址。

通常 ret 会弹出它并将控制权返回给调用者,但这里的代码将地址弹出到 ebx 并将其用作中断的参数。

,

Linux 将从 _start 标签开始运行程序,然后它的第一行跳转到 BB call A 这将导致处理器推送返回地址调用后的指令(在这种情况下只是字符串的地址)到堆栈上,然后处理器将转到 A 从那里执行指令,A 继续执行指令直到它完成但它不使用 ret 指令返回(这将导致从堆栈中弹出返回地址并跳转到该地址),因此处理器将照常按顺序执行指令,这意味着它将再次执行调用指令(无限循环) .

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。