首页
社区
课程
招聘
[讨论]关于栈溢出利用时,如何正确绕过canary、NX、ASLR防护机制?
发表于: 2018-11-26 19:37 18128

[讨论]关于栈溢出利用时,如何正确绕过canary、NX、ASLR防护机制?

2018-11-26 19:37
18128
目前pwn中常见的栈溢出保护机制有:canary、NX、ASLR。
面对具体的含栈溢出的pwn题时,有几个场景不是很确定思路,把自己的理解说一下,不知道是否准确,求助大家指导。

    由于是栈溢出,因此,只要NX开启,则只能利用ret2libc的方式执行shellcode。
    以下讨论都是基于栈溢出和NX开启:

1.  ASLR关闭,已知libc

地址固定,且libc已知,则直接ret至libc的shellcode即可。

若开启了canary保护,则需要先通过栈溢出,泄露canary(即题目中必须有两处越界才行。第一次泄露canary,第二次才是劫持运行逻辑),然后利用canary,劫持运行逻辑至libc的shellcode。

2.  ASLR关闭,无libc

若开启了canary,则需要先通过栈溢出,泄露canary(即题目中必须有两处越界才行。第一次泄露canary,第二次才是劫持运行逻辑),然后利用canary,劫持运行逻辑,泄露syscall地址或libc(system()、”/bin/sh”)地址,然后再次劫持到前面泄露的地址

writeup中,使用的是泄露syscall的方式;可以尝试泄露libc的方式编写shellcode。

3.  ASLR开启,已知libc

泄露某个libc函数地址,然后根据偏移,计算出system地址、/bin/sh地址,然后再次劫持运行逻辑,准备参数,跳转至system。

4.  ASLR开启,无libc

通过 Memory Leak & DynELF 内存泄露技术,可以主动搜索libc中的system()地址。

但是无法泄露”/bin/sh”地址,还需要read来输入到.bss段;然后再劫持到 system()地址。最终获取shell

5.  canary开启

由于canary是栈溢出的第一步防线,想绕过canary,是不是要求题目中给出两次栈溢出场景才行?

    第一次,泄露canary值;

    第二次,真正利用栈溢出来劫持程序逻辑。

问题是,如果题目没有两次栈溢出的话,如何绕过canary?







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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 763
活跃值: (323)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
emmmm,因程序功能各异吧,而且canary开启的时候正常的栈溢出都没法利用,何来一次泄露canary,一次劫持控制流?
2018-11-26 22:17
0
雪    币: 199
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
pwnda emmmm,因程序功能各异吧,而且canary开启的时候正常的栈溢出都没法利用,何来一次泄露canary,一次劫持控制流?
如果两次栈溢出时,题目本来就有write或printf来输出缓冲区,就可以把canary泄露了;之前有个题就是这样的。

那大侠觉得应该怎么绕过canary呢?
2018-11-27 08:40
0
雪    币: 763
活跃值: (323)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
callmexxaqer 如果两次栈溢出时,题目本来就有write或printf来输出缓冲区,就可以把canary泄露了;之前有个题就是这样的。 那大侠觉得应该怎么绕过canary呢?
不好意思,之前没看过这样的题,还是根据题目功能来吧,比如用scanf("%d")越界写,到canary位置的时候输入'+'就过了,泄露TLS段内容,或者线程栈tls就在栈的高地址,这样的套路太多了,还是得根据题目功能来搞吧。
2018-11-27 09:52
0
雪    币: 299
活跃值: (199)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
在溢出的时候溢出canary的一个字节,程序如果正常运行,记录下这个字节,再溢出下一个字节,这样可以泄露canary吗,这好像是我在ctfwiki上看到的
2019-4-4 11:54
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
NX开了就只能ret2libc吗?为啥我做ctfshow好几题开了NX给了后门也只要直接接后门打就行了?
2021-4-20 17:51
0
游客
登录 | 注册 方可回帖
返回
//