首页
社区
课程
招聘
4
栈溢出漏洞利用(绕过ASLR)
发表于: 2021-9-17 23:05 28909

栈溢出漏洞利用(绕过ASLR)

2021-9-17 23:05
28909

背景介绍
  原文:https://sploitfun.wordpress.com/2015/05/08/bypassing-aslr-part-iii

  • 原文内容比较精炼,只阐述关键思路,没有具体到一些细节;
  • 原文提供的利用脚本,很多数值需要根据实际环境修改,才能成功执行;
  • 原文文字内容可以直接通过链接看到,但其中的图片,是链接到google的,如果访问不到,可以对照附件中的pdf文件一起看。

  另外需要说明一下,原文只是一个系列中的一篇文章:

  学习这篇之前,最好先把前面的都搞明白,本文的细节,只针对Part III using GOT overwrite and GOT dereference这篇。

 

1. 漏洞程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// vuln.c
#include
#include
#include
 
int main (int argc, char **argv) {
    char buf[256];
    int i;
    seteuid(getuid());
    if(argc < 2) {
        puts("Need an argument\n");
        exit(-1);
    }
    strcpy(buf, argv[1]);
    printf("%s\nLen:%d\n", buf, (int)strlen(buf));
    return 0;
}

准备工作:

1
2
3
4
5
6
7
# 编译vuln.c,并修改vuln可执行文件属性
  sudo gcc -fno-stack-protector -o vuln vuln.c
  sudo chown root vuln
  sudo chgrp root vuln
  sudo chmod +s vuln
# 打开ASLR
  sudo sh -c 'echo 2 > /proc/sys/kernel/randomize_va_space'

程序说明:

  • 行9:setuid(getuid())
    由于以上步骤,通过chmod +s vuln,给vuln可执行文件添加了粘滞位,这就使普通用户(比如:jmpcall)执行vuln,在刚进入main()函数时,拥有vuln所属用户的权限(即root权限),setuid(getuid())就是将权限改回执行者本身的权限,其实就是给利用增加难度,期望的是,即使被攻击者拿到shell,也只是个普通的shell,不具有root权限(就等同于没给vuln添加粘滞位)。
  • 行14:strcpy(buf, argv[1])
    将命令行参数内容,拷贝到buf[256],没有限制拷贝长度,从而存在栈溢出漏洞。

2. 问题分解
  面对一个复杂的问题时,通常需要自上而下、以大化小、分而治之,直接上图:

  换个方式来说明最终目标的话,就是要让vuln执行这样一段代码:

1
2
3
4
5
char *p = "/bin/sh";
char **argv = { p, NULL };
 
setuid(0);
execve(p, argv, NULL);

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

最后于 2021-9-18 12:45 被jmpcall编辑 ,原因: 添加附件
上传的附件:
收藏
免费 4
支持
分享
赞赏记录
参与人
雪币
留言
时间
嫉妒的死远点
为你点赞!
2024-11-28 02:49
PLEBFE
为你点赞~
2022-7-27 21:39
飘零丶
为你点赞~
2022-7-17 02:29
MTRush
为你点赞~
2021-9-22 21:29
最新回复 (7)
雪    币: 154
活跃值: (1225)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
先mark
2021-9-23 10:04
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
大神您好,如果这篇文章里的例子是64位的程序,有没有好的方法处理地址带有00的情况
2022-3-7 13:18
0
雪    币: 3748
活跃值: (11451)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
4
从原理上讲,欺骗漏洞程序执行strcpy(),间接的构造最终需要的地址,64位并不比32位多什么限制,不过strcpy()的次数可能要多些,你的担心是什么?
2022-3-7 15:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
谢谢大神的回复。64位的地址都是带有00的,当写在payload里面的时候,strcpy拷贝就会把payload截断,请问一下这个怎么处理或者转化比较好
2022-3-7 23:56
0
雪    币: 3748
活跃值: (11451)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
6
你可以再仔细看看这篇帖子或者原文的内容,虽然这里是用32位程序举例的,但也遇到需要往溢出区间构造0值的问题了,比如需要给setid()构造0参数值,你可能是还没看明白:溢出数据本身,又执行了多次strcpy()
2022-3-8 09:48
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
不是构造0,是rop指令所在的地址都是带00的啊,这样溢出的时候就被strcpy截断了
2022-3-8 14:06
0
雪    币: 3748
活跃值: (11451)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
8
mb_uuhlubck 不是构造0,是rop指令所在的地址都是带00的啊,这样溢出的时候就被strcpy截断了
这就要问专业的大佬了,我是业余学着玩玩,开始没有考虑到这种情况。
2022-3-8 15:15
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册