-
-
[原创]关于payload中为什么有虚假地址
-
发表于: 2021-8-25 12:16 8428
-
我们以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相当于返回地址
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-9-3 14:58
被凡人_编辑
,原因:
赞赏记录
参与人
雪币
留言
时间
windy_ll
为你点赞~
2021-10-21 11:24
凡人_
为你点赞~
2021-9-1 12:59
Roland_
为你点赞~
2021-9-1 10:30
赞赏
他的文章
- [求助]新手学Windows求助 7341
- [原创]ciscn_2019_es_2栈转移 26611
- [原创]关于payload中为什么有虚假地址 8429
- [原创]Use-after-free之lab 10 hacknote 14442
看原图
赞赏
雪币:
留言: