pwn中直接调用(plt)system函数和调用call system函数区别

溢出大概有两种形式

直接调用system函数,就是plt表的system函数

image-20230819232257391

1
payload = padding + p64(system_addr)+p64(1)+p64(binsh_addr)

调用call system

image-20230819232341713

1
payload = padding + p64(call_system_addr)+p64(binsh_addr)

可以看出上述两种情况只差了一个p64(1)。

其实这个p64(1)的作用是相当于一个返回地址。

为什么?

先回顾一下函数调用过程,比如说我们要调用system(‘/bin/sh’)。

首先程序在编译这一步,实际上执行的是:

1
2
3
lea eax, [address_binsh_str]
push eax
call system

call指令其实还有两步:

1
2
push ip					;执行system_addr之后的返回地址
jmp system_addr

因此,直接调用system函数时,在system地址后面要接上一个返回地址,再接上system函数的参数。

而如果调用的是call system的话,返回到call system之后,才会执行push ip的操作,这个时候的push操作不需要我们关心,因此payload直接就是call_system_addr + binsh_addr