首页 > 其他分享 >《信息安全系统设计与实现》第六周学习笔记

《信息安全系统设计与实现》第六周学习笔记

时间:2023-10-11 09:13:44浏览次数:35  
标签:get int 信息安全 笔记 第六周 fd include buf block

第十一章 EXT2 文件系统

EX2文件系统数据结构

创建虚拟硬盘

mke2fs [-b blksize -N ninodes] device nblocks

虚拟磁盘布局


Block#0:引导块

超级块

Block#1
容纳整个文件系统的信息

超级块的重要字段:

    u32 s_inodes_count://文件系统中节点总数
    u32 s_blocks_count://文件系统中块总数
    u32 s_r_blocks_count://为超级用户保留的块数
    u32 s_free_blocks_count: //文件系统中空闲块总数
    u32 s_mtime://文件系统的挂接时间
    u32 s_wtime://最后一次对该超级块进行写操作的时间
    u32 s_magic ://魔数签名,用于确定文件系统版本的标志
    u32 s_inodes_per_group://表示每个组块的inode数目,查找文件inode所在块的位置很重要
    u32 s_mnt_count://文件系统挂接计数
    u32 s_max_mnt_count://文件系统最大挂接计数
    u32 s_state://文件系统的状态

块描述符

Block#2

块和索引节点位图

  • BLOCK#8:块位图
  • BLOCK:9:索引节点位图

索引节点

BLOCK#10:索引节点

  • 直接块
  • 间接块
  • 双重间接块
  • 三重间接块

数据块

紧跟在索引节点块后面的是文件存储数据块

目录条目

包含dir_entry结构

邮差算法

Linear_address LA = N*block + house;
Block_address BA = (LA/N,LA%N);

C语言中的Test-Set-Clear位

C语言结合使用邮差算法和位屏蔽来进行下面的位操作

将索引节点号转换为磁盘上的索引节点

编程示例(实践部分)

  • superblock.c程序显示EXT2文件系统的超级块信息
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/io.h>
#include <ext2fs/ext2_fs.h>
typedef unsigned char u8;
typedef struct ext2_super_block SUPER;
typedef struct ext2_group_desc GD;
#define BLKSIZE 1024

SUPER *sp;
GD *gp;
char buf[BLKSIZE]; 
int fd;
// get_block() reads a disk block into a buf[]?
int get_block(int fd, int blk, char *buf)
{
    lseek(fd, (long)blk*BLKSIZE, SEEK_SET); 
    return read(fd, buf, BLKSIZE);
}

int imap(char *device)
{
    int i, ninodes, blksize, imapblk;
    fd = open(device, O_RDONLY);
    if (fd < 0) 
    {
        printf("open %s failed\n", device);
        exit(1);
    }
    get_block(fd, 1, buf);	// get superblock
    sp = (SUPER *)buf;
    // check magic number to ensure itz s an EXT2 FS ninodes = sp->s_inodes_count	//
    ninodes = sp->s_inodes_count;
    printf("ninodes = %d\n", ninodes);
    get_block(fd, 2, buf);	//
    gp = (GD *)buf;
    imapblk = gp->bg_inode_bitmap;	
    printf("imapblk = %d\n", imapblk);
    get_block(fd, imapblk, buf);	
    for ( i = 0; i <= ninodes/8; i++)
    {
        printf("%02x ", (u8)buf[i]);
    }
    printf("\n");
}
char *dev = "mydisk";
int main(int argc, char*argv[])
{
    if(argc>1) dev = argv[1];
    imap(dev);
}

遇到以下问题:


通过翻书,发现需要输入

sudo apt-get install e2fslibs-dev e2fslibs-dev

安装ext2fs开发包

  • 显示位图
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/io.h>
#include <ext2fs/ext2_fs.h>
typedef unsigned char u8;
typedef struct ext2_super_block SUPER;
typedef struct ext2_group_desc GD;
#define BLKSIZE 1024

SUPER *sp;
GD *gp;
char buf[BLKSIZE]; 
int fd;
// get_block() reads a disk block into a buf[]?
int get_block(int fd, int blk, char *buf)
{
    lseek(fd, (long)blk*BLKSIZE, SEEK_SET); 
    return read(fd, buf, BLKSIZE);
}

int imap(char *device)
{
    int i, ninodes, blksize, imapblk;
    fd = open(device, O_RDONLY);
    if (fd < 0) 
    {
        printf("open %s failed\n", device);
        exit(1);
    }
    get_block(fd, 1, buf);	// get superblock
    sp = (SUPER *)buf;
    // check magic number to ensure itz s an EXT2 FS ninodes = sp->s_inodes_count	//
    ninodes = sp->s_inodes_count;
    printf("ninodes = %d\n", ninodes);
    get_block(fd, 2, buf);	//
    gp = (GD *)buf;
    imapblk = gp->bg_inode_bitmap;	
    printf("imapblk = %d\n", imapblk);
    get_block(fd, imapblk, buf);	
    for ( i = 0; i <= ninodes/8; i++)
    {
        printf("%02x ", (u8)buf[i]);
    }
    printf("\n");
}
char *dev = "mydisk";
int main(int argc, char*argv[])
{
    if(argc>1) dev = argv[1];
    imap(dev);
}

  • 显示根索引节点
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/io.h>
#include <ext2fs/ext2_fs.h>
#define BLKSIZE 1024
typedef struct ext2_group_desc GD;
typedef struct ext2_super_block SUPER;
typedef struct ext2_dir_entry_2 DIR;
typedef struct ext2_inode INODE;
SUPER *sp;
GD *gp;
INODE *ip;
DIR *dp;
char buf[BLKSIZE];
int fd,firstdata, inodesize ,blksize, iblock;
char *dev = "mydisk";

int get_block(int fd, int blk, char *buf)
{
    lseek(fd, blk*BLKSIZE, SEEK_SET);
    return read(fd, buf, BLKSIZE);
}

int inode (char *dev)
{
    int i;
    fd = open(dev, O_RDONLY);
    if(fd < 0)
    {
        printf("open faild\n");
        exit(1);
    }
    get_block(fd, 2, buf);
    gp = (GD *)buf;
    printf("bmap_block=%d imap_block=%d inodes_table=%d \n", 
            gp->bg_block_bitmap,
            gp->bg_inode_bitmap,
            gp->bg_inode_table);
    iblock = gp->bg_inode_table;
    printf("----root inode information----\n");
    get_block(fd, iblock, buf);
    ip = (INODE *)buf;
    ip++;
    printf("mode = %4x ",ip->i_mode);
    printf("uid = %d gid = %d\n", ip->i_uid, ip->i_gid);
    printf("size = %d\n", ip->i_size);
    
    //unsigned int tmp = ip->i_ctime;
    printf("ctime = %s",ctime((const time_t *)&ip->i_ctime));
    printf("links = %d\n", ip->i_links_count);
    for ( i = 0; i < 15; i++)
    {
        if(ip->i_block[i])
        {
            printf("i_block[%d] = %d\n", i, ip->i_block[i]);
        }
    }
}

int main(int argc, char *argv[])
{
    if(argc>1) dev = argv[1];
    inode(dev);
}

3级文件系统函数

挂载算法

mount filesys mount_point

可将某个文件系统挂载到mount_point目录上
卸载算法同理

卸载算法

交叉挂载点

  • 向下遍历
  • 向上遍历

文件保护

9个权限位

文件系统项目拓展

多个组-4KB大小块-管道文件-I/O缓冲

苏格拉底挑战

  • EXT2文件系统数据结构

  • 3级文件系统


标签:get,int,信息安全,笔记,第六周,fd,include,buf,block
From: https://www.cnblogs.com/wangqi3206/p/17755973.html

相关文章

  • 2023_10_10_MYSQL_DAY_02_笔记
    2023_10_10_MYSQL_DAY_02_笔记#在FROM子句中使用子查询SELECTa.ename,a.sal,a.deptno,b.salavgFROMempa,(SELECTdeptno,AVG(sal)salavgFROMempGROUPBYdeptno)bWHEREa.deptno=b.deptnoANDa.sal>b.s......
  • 《架构师之路:软件架构之美》第四,五章读书笔记
    第四章:系统可伸缩性的重要性第四章讨论了系统可伸缩性的重要性。在现代软件开发中,可伸缩性是一个关键概念,它涉及到系统在不同负载下的性能表现。以下是一些关键观点:可伸缩性是应对用户增长和数据量增加的关键。一个好的架构应该能够轻松扩展以满足这些需求,而不需要完全重新设......
  • 拓扑排序学习笔记
    拓扑排序-oiwiki在有向无环图中,若一个由该图中所有点构成的序列满足:图中所有边(x,y),x在序列A中都出现在y前,则称A是该图的一个拓扑序。求解序列A的过程就叫拓扑排序。拓扑排序可以解决一个有向无环图的所有节点排序。我理解的话,就是按每个店的入度多少的顺序找到一......
  • 代码大全阅读笔记01
    1、开发前期准备相关需求阶段在需求阶段,我们需要明确定义用户的需求,这样不仅能够避免与用户的争议,还能够更好地让用户更快地熟悉系统、使用系统;处于该阶段的错误的解决时间最好接近于发现错误的时间,不然越拖越久,改正错误的代价就会相应的增大;架构优秀的软件架构很大程度上与......
  • ubuntu 设置合上笔记本盖子不休眠的方法
    编辑下列文件:sudogedit/etc/systemd/logind.conf#HandlePowerKey按下电源键后的行为,默认poweroff#HandleSleepKey按下挂起键后的行为,默认suspend#HandleHibernateKey按下休眠键后的行为,默认hibernate#HandleLidSwitch合上笔记本盖后的行为,一般为默认suspend(改为ignore;即合盖不......
  • Programming abstractions in C阅读笔记:p176-p178
    《ProgrammingAbstractionsInC》学习第59天,p176-p178总结。一、技术总结1.addtivesequencestn=tn-1+tn-2序列:3,7,10,17,27,44,71,115,186,301,487,788,1275,...p177,Asageneralclass,thesequencesthatfollowthispatternarecalledadditivesequen......
  • Programming abstractions in C阅读笔记:p176-p178
    《ProgrammingAbstractionsInC》学习第59天,p176-p178总结。一、技术总结1.addtivesequencestn=tn-1+tn-2序列:3,7,10,17,27,44,71,115,186,301,487,788,1275,...p177,Asageneralclass,thesequencesthatfollowthispatternarecalledadditive......
  • c++对象模型学习笔记
    参照大佬的博客学习了一下c++的对象模型:https://www.cnblogs.com/skynet/p/3343726.html有些思考需要做下记录。对于有虚函数表的类的对象,它的起始地址处会存储vptr指向虚函数表,在这个虚函数表的前4或8字节中,会存储一个地址值,指向RTTI类型信息对于没有虚函数表的类的对象,也就......
  • npm笔记
    npmconfigsetcache"D:\nodejs\node_cache"//设置缓存文件夹npmconfigsetprefix"D:\nodejs\node_global"//设置全局模块存放路径npminstall-gcnpm--registry=https://registry.npm.taobao.orgnpminstallyarn-gyarnconfigsetglobal-folder&qu......
  • 莫比乌斯反演 学习笔记
    前置知识整除分块把之前写的博客搬过来了模型求\(\large\sum^{n}_{i=1}\lfloor{\frac{n}{i}}\rfloor\)假设\(n\)等于10,我们可以列出下表:\(\i\)12345678910\(\frac{10}{i}\)10532211111如果我们的\(n\)更大时,我们可以发现\(\fra......