-
-
[原创]关于payload中为什么有虚假地址
-
发表于:
2021-8-25 12:16
8635
-
我们以wiki中一道简单的题ret2libc1为例

题目非常简单
程序内涵system()函数和‘/bin/sh’字符串
gets()函数未检查接受字符串长度而造成栈溢出 
这里是wiki给出的payload,它将其中的'b'*4称之为虚假的地址,那么它究竟有什么用呢,为什么要加这么一个虚假的地址呢。在此做出如下解释:
首先这里有几个零碎的知识点:
push eip
jmp
pop eip
mov esp,ebp
pop ebp
push ebp
mov ebp,esp
leave
ret
在发送payload之前栈上的状态大概是这样的 
在将payload发送至栈上(gets函数接收payload)时,栈上状态变成这样

按照程序的执行流程我们此时要进入main函数的结尾且进入system函数
所以我们要经过main函数结尾的命令
leave
ret
此时栈变成如下状态 
紧接着进入了system函数,首先就是以下命令
push ebp
mov ebp,esp
此时栈上情况变成了这样 
此时栈上的情况恰好满足'/bin/sh'地址(参数1)的位置为 ebp+8
此时第一个红方块的'a'*4相当于push ebp的ebp,而'b'*4相当于返回地址
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2021-9-3 14:58
被凡人_编辑
,原因: