硬核二进制安全学习:Buffer Overflow(栈的缓冲区溢出&&Pwn技巧Return to Text)

精选文章:
硬核二进制安全学习FunctionPrologue and Function Epilogue基础函数调用机制
本文摘录:

所谓PWN就是利用程序的漏洞控制程序的流程,简单来说就是需要控制RIP寄存器,因为RIP寄存器会告诉CPU你接下来会做什么那么现在我们就有黑客思维了,竟然我们可以将RIP的address写为0x6161616161,那么为何不把它改成有用的地址呢?

NTUSTISC Pwn basic 台湾科技大学
Buffer Overflow:
实例程序:
在这里插入图片描述
这里我们只用char类型定义了一个0x10的空间大小
我们使用read指令读取buf函数0x30地址,这样就造就了Buffer
Overflow的条件。
首先执行完Function初始化
程序在栈中是这样执行的,如下图:
在这里插入图片描述
在这里插入图片描述
如果我们要去往0x10空间里放入数据,如字符a,显而易见,只能放入16个a,因为0x10=16,
这时会发现stack还保留了old rbp指针开辟的空间,所以,程序读取0x20也是没问题的。
在这里插入图片描述
这时候程序要完成Base Stack(栈底)return address的Function Epilogue函数收尾工作。
在这里插入图片描述

#假设 
rsp = 0x7fffffffefd8
rbp = 0x7fffffffefe8
rip  = 0x40067
0x40067: leave 
0x400678: ret 
0x40067 : mov rsp,rbp
0x400678 : pop rbp 

RIP寄存器即在64bit模式下,intel汇编命令名称,32bit下称作EIP,标志当前进程将要执行指令位置。
mov rsp , rbp
在这里插入图片描述

pop rbp

push寄存器:将一个寄存器中的数据入栈
pop寄存器:出栈用一个寄存器接收数据

在这里插入图片描述
使用pop指令之后,我们a的值会跳出stack进行执行,即
rbp的值=‘a’=‘0x61’

下一步是将RIP寄存器Return的值pop到RIP
RIP=我们溢出的值=‘0x616161616161616161’
这个时候,CPU会报错,Segmentation Fault

Segmentation Fault 简介:参考文章地址:添加链接描述

所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及相应的断限和页面交换还有程序运行级别和内存粒度等信息,一旦一个程序发生了越界访问,CPU就会产生相应的异常保护,于是segmentation fault就出现了。

在这里插入图片描述
程序编译时发生报错了,那么就表明我们可以利用这个弱点,竟然我们现在已经可以把程序crash掉,那么如何控制程序流程运行呢?

所谓Pwn就是利用程序的漏洞控制程序的流程,简单来说就是需要控制RIP寄存器,因为RIP寄存器会告诉CPU你接下来会做什么
那么现在我们就有黑客思维了,竟然我们可以将RIP的address写为0x6161616161,那么为何不把它改成有用的地址呢?

所以我们利用的第一个技巧称为Return to Text
在这里插入图片描述
Text指的是Text段,参考文章添加链接描述

在这里插入图片描述
在这里插入图片描述
假设我们知道secret_func()函数地址 0x4006e7
里面包含了我们的passwd。
那么我们为什么覆盖a的值呢?所以直接覆盖到地址0x4006e7
rip=0x6004e7
在这里插入图片描述

那么现在我们开始Pwn吧!(敬请期待)

CSDN:知柯信息安全™️
微信公众号:知柯信息安全
深圳市狩猎者网络安全技术有限公司
关注获取更多资讯

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT鹅

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值