首页
社区
课程
招聘
[原创]关于payload中为什么有虚假地址
2021-8-25 12:16 7627

[原创]关于payload中为什么有虚假地址

2021-8-25 12:16
7627

我们以wiki中一道简单的题ret2libc1为例

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

①call指令相当于

push eip
jmp

②ret指令相当于

pop eip

③leave指令相当于

mov esp,ebp
pop ebp

④c语言调用约定cdecl:调用者负责清栈

⑤每次进入函数中,函数开头的汇编代码总是

push ebp
mov ebp,esp

⑥每次函数结尾总是

leave
ret

⑦调用函数参数是通过ebp和距离参数的偏移进行调用,例如参数1在栈上的位置为ebp+8,参数2在栈上的位置为ebp+12以此类推

好了让我们开始分析吧

在发送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相当于返回地址


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2021-9-3 14:58 被凡人_编辑 ,原因:
上传的附件:
收藏
点赞3
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回