关于《Smashing The Stack For Fun And Profit》execve()汇编与总结矛盾的疑问
关于《Smashing The Stack For Fun And Profit》中execve汇编代码的疑问解答
首先明确x86 Linux下execve()系统调用的参数规范:
- 寄存器
EBX需要存储程序路径字符串的地址(比如"/bin/sh"的内存地址) - 寄存器
ECX需要存储argv数组的地址(argv是一个以NULL结尾的指针数组,第一个元素是程序路径字符串的地址,也就是"字符串地址的地址") - 寄存器
EDX通常存储NULL(表示空环境变量数组)
你提到的汇编代码是对execve()函数的底层实现:
movl 0x8(%ebp),%ebx:从函数栈帧中取出第一个参数(即"/bin/sh"的地址)存入EBX,完全符合系统调用的参数要求movl 0xc(%ebp),%ecx:取出第二个参数(即argv数组的地址)存入ECX,也完全符合系统调用要求
你没有理解错误,问题出在作者的总结表述上——它把EBX和ECX的要求写反了。按照系统调用规范和实际汇编代码的逻辑,EBX存的是字符串地址,ECX存的才是"字符串地址的地址"(即argv数组的地址),这应该是作者总结时的笔误。
内容的提问来源于stack exchange,提问作者Junhui Zhu
相关产品推荐
相关产品推荐

