清除局部变量

时间:2015-02-04 20:31:37

标签: assembly x86

当我调用一个接收参数的函数时,自己的函数使用&#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

1 个答案:

答案 0 :(得分:3)

如果函数或系统调用需要指向位于堆栈或堆上的数据的指针,它肯定不会清理这些数据。如果调用协议需要它,它只会删除指向这些数据的指针。