如何解决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
标签开始运行程序,然后它的第一行跳转到 B
,B
call A
这将导致处理器推送返回地址调用后的指令(在这种情况下只是字符串的地址)到堆栈上,然后处理器将转到 A
从那里执行指令,A
继续执行指令直到它完成但它不使用 ret
指令返回(这将导致从堆栈中弹出返回地址并跳转到该地址),因此处理器将照常按顺序执行指令,这意味着它将再次执行调用指令(无限循环) .
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。