当我调用一个接收参数的函数时,自己的函数使用&#34清除推送的数据;添加esp,n"和POPs的局部变量,OK。
当我调用接收指针(地址)的函数或调用接收指针的系统调用时...这些函数/系统调用如何清除堆栈中的参数?指向的数据可以位于堆栈中或堆中。 例如:
push edx ; NULL ;
push 0x68732f6e ; "n/sh" ; "//bin/sh\0"
push 0x69622f2f ; "//bi" ;
mov ebx, esp ; ebx = &"//bin/sh\0"
push edx ; NULL
push ebx ; &"//bin/sh\0"
mov ecx, esp ; ecx = args[&"//bin/sh\0", NULL]
push edx ; NULL
mov edx, esp ; edx = envp[NULL]
int 0x80
需要执行RET的源示例:
BITS 32
section .text
global _start
_start:
call Foo
; exit
mov ebx, 0
mov eax, 1
int 0x80
Foo:
push ebp
mov ebp, esp
; Create the socket file descriptor
; int socket(int domain, int type, int protocol)
mov al, 102 ; __NR_socketcall
mov bl, 1 ; __NR_socketcall type (socket)
; socket parameters
sub esp, 8 ; sin_zero
push 6 ; IPPROTO_TCP
push 1 ; SOCK_STREAM
push 2 ; AF_INET
mov ecx, esp ; &uargs
int 0x80 ; socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
; add esp, 0
mov esp, ebp
pop ebp
ret
答案 0 :(得分:3)
如果函数或系统调用需要指向位于堆栈或堆上的数据的指针,它肯定不会清理这些数据。如果调用协议需要它,它只会删除指向这些数据的指针。