构造带有堆栈保护的指令流
2021-01-14 19:16发布
常德seo
1587745815_5ea31417c0222.png (23.57 KB, 下载次数: 0)
下载附件
2020-5-27 11:38 上传
1587746171_5ea3157b00597.png (234.75 KB, 下载次数: 0)
2020-5-27 11:39 上传
19.png (21.99 KB, 下载次数: 0)
16.png (27.78 KB, 下载次数: 0)
2020-5-27 11:40 上传
eax 系统调用号 ebx 第一个参数 ecx 第二个参数 edx 第三个参数 esi 第四个参数 edi 第五个参数 int 0×80
13.png (31.14 KB, 下载次数: 0)
2020-5-27 11:43 上传
12.png (17.52 KB, 下载次数: 0)
2020-5-27 11:44 上传
11.png (19.88 KB, 下载次数: 0)
2020-5-27 11:45 上传
9.png (20.72 KB, 下载次数: 0)
2020-5-27 11:46 上传
8.png (35.79 KB, 下载次数: 1)
2020-5-27 11:48 上传
最多设置5个标签!
0×01 引言
我们在学ropgadgets与ret2syscall技术原理时 构造指令流时 是没有加堆栈保护的 比如下面的程序:
文件名:7.c
我们是这样编译的 是没有加堆栈保护的 之后再利用ropgadgets构造指令流 就可以
成功去执行execve(“/bin/sh”,null,null)。
如果加上堆栈保护我们该怎么过呢?像下面这样编译:
显然我们就不能像原来一样构造指令流了 因为加入了堆栈保护 那我们该怎么办呢?我们可以利用格式化输出
将canary打印出来 然后再进行指令的组装。
0×02 找地址
调试我们的程序 找到canary的地址 地址在:0xffffcfac
1587745815_5ea31417c0222.png (23.57 KB, 下载次数: 0)
下载附件
2020-5-27 11:38 上传
继续调试 直到printf 我们看看现在canary据栈顶的位置:0060 除以4等于15 说明传给第一个read
函数的值为%15$08x 就可以将canary打印出来了
1587746171_5ea3157b00597.png (234.75 KB, 下载次数: 0)
下载附件
2020-5-27 11:39 上传
重新调试 找到read函数把读进来的数据存放的地址:0xffffcf8c
19.png (21.99 KB, 下载次数: 0)
下载附件
2020-5-27 11:39 上传
将%15$08x给read函数 发现可以将canary打印出来
16.png (27.78 KB, 下载次数: 0)
下载附件
2020-5-27 11:40 上传
接下来就是利用好第二个read函数来构造rop链了
0×03 构造rop链
linux上系统调用原理:
所以eax就存放execve函数的系统调用号11 ebx存放第一个参数/bin/sh ecx存放第二个
参数null 就是0 edx存放第三个参数 也是0
地址用:0x080b8546
13.png (31.14 KB, 下载次数: 0)
下载附件
2020-5-27 11:43 上传
地址为:0x0806f210
12.png (17.52 KB, 下载次数: 0)
下载附件
2020-5-27 11:44 上传
地址用:0x080bbd80
11.png (19.88 KB, 下载次数: 0)
下载附件
2020-5-27 11:45 上传
地址为:0x0806ce37
9.png (20.72 KB, 下载次数: 0)
下载附件
2020-5-27 11:46 上传
0×04 写出poc
从from pwn import *到canary=canary.decode(“hex”)[::-1]都是为了找出canary 因为加了堆栈保护
我们不能直接把数据打入到堆栈中所以要先找出canary,然后构造payload,我们要把canary加进去过
堆栈保护再在后面加上我们的rop链。
执行成功
8.png (35.79 KB, 下载次数: 1)
下载附件
2020-5-27 11:48 上传
0×05 总结
开启了堆栈保护 加入了cookie 一旦我们破坏了堆栈 会引起系统保护 出现异常 但是我们还是需要构造我们的指令流
我们可以利用格式化输出,将canary打印出来,接下来我们可以利用读写函数,构造一个指令流,我们先去读看一
下堆栈的canary在哪里,然后我们canary搞出来,把canary再回填进去,进行组装,这样就即可以过堆栈保护
也可以构造我们的指令流了。
0×01 引言
我们在学ropgadgets与ret2syscall技术原理时 构造指令流时 是没有加堆栈保护的 比如下面的程序:
文件名:7.c
我们是这样编译的 是没有加堆栈保护的 之后再利用ropgadgets构造指令流 就可以
成功去执行execve(“/bin/sh”,null,null)。
如果加上堆栈保护我们该怎么过呢?像下面这样编译:
显然我们就不能像原来一样构造指令流了 因为加入了堆栈保护 那我们该怎么办呢?我们可以利用格式化输出
将canary打印出来 然后再进行指令的组装。
0×02 找地址
调试我们的程序 找到canary的地址 地址在:0xffffcfac
1587745815_5ea31417c0222.png (23.57 KB, 下载次数: 0)
下载附件
2020-5-27 11:38 上传
继续调试 直到printf 我们看看现在canary据栈顶的位置:0060 除以4等于15 说明传给第一个read
函数的值为%15$08x 就可以将canary打印出来了
1587746171_5ea3157b00597.png (234.75 KB, 下载次数: 0)
下载附件
2020-5-27 11:39 上传
重新调试 找到read函数把读进来的数据存放的地址:0xffffcf8c
19.png (21.99 KB, 下载次数: 0)
下载附件
2020-5-27 11:39 上传
将%15$08x给read函数 发现可以将canary打印出来
16.png (27.78 KB, 下载次数: 0)
下载附件
2020-5-27 11:40 上传
接下来就是利用好第二个read函数来构造rop链了
0×03 构造rop链
linux上系统调用原理:
所以eax就存放execve函数的系统调用号11 ebx存放第一个参数/bin/sh ecx存放第二个
参数null 就是0 edx存放第三个参数 也是0
地址用:0x080b8546
13.png (31.14 KB, 下载次数: 0)
下载附件
2020-5-27 11:43 上传
地址为:0x0806f210
12.png (17.52 KB, 下载次数: 0)
下载附件
2020-5-27 11:44 上传
地址用:0x080bbd80
11.png (19.88 KB, 下载次数: 0)
下载附件
2020-5-27 11:45 上传
地址为:0x0806ce37
9.png (20.72 KB, 下载次数: 0)
下载附件
2020-5-27 11:46 上传
0×04 写出poc
从from pwn import *到canary=canary.decode(“hex”)[::-1]都是为了找出canary 因为加了堆栈保护
我们不能直接把数据打入到堆栈中所以要先找出canary,然后构造payload,我们要把canary加进去过
堆栈保护再在后面加上我们的rop链。
执行成功
8.png (35.79 KB, 下载次数: 1)
下载附件
2020-5-27 11:48 上传
0×05 总结
开启了堆栈保护 加入了cookie 一旦我们破坏了堆栈 会引起系统保护 出现异常 但是我们还是需要构造我们的指令流
我们可以利用格式化输出,将canary打印出来,接下来我们可以利用读写函数,构造一个指令流,我们先去读看一
下堆栈的canary在哪里,然后我们canary搞出来,把canary再回填进去,进行组装,这样就即可以过堆栈保护
也可以构造我们的指令流了。
一周热门 更多>