昨天参加了下CVTE公司的技术面试,虽然在终面没过,但还是收获不少,毕竟是我第一回参加公司的面试,与自己所想像的面试情景有点不一致,因此在这我想利用一点点时间来总结我个人在这几轮面试当中的收获.


CVTE虽说不是一个大型公司,由于看到往年学长进去之后的感受,CVTE开出的待遇比其它很多公司都诱人,但每年CVTE只在全国招收200个应届生,因此平均下来每个省所招收的名额比较有限,面试也有一定的广度和深度,所选出来的同学的能力水平也就不用再说了.最开始的是笔试,笔试当中因为只有27道题目,所含盖的东西不多,这里我就不提了.


好了开始面试的总结吧,我面试的是嵌入式软件工程师,我把我此时能记起来的都尽力写下来,给大家提供一个参考.一面:面试期间面试官首先是让你进行自我介绍,问问你以后的职业规划,希望到哪些城市工作,之后就是问你在大学期间的项目经验,以及在这些项目中选一个你最满意的一个,从中遇到了一些什么问题,是如何解决的.随后就出一个算法题目,让你在5分钟之内把代码写出来,给我出的第一道算法题目还算是比较简单,是一个二分法查找的,我用递归实现的;接下来问你C++面向对象的编程语言与C面向过程的语言有哪些区别,然后在C++的类的继承,函数重载以及多态等这些问题上来考查你,比如说C++的多态是如何来实现的.问完这些后就是网络协议了,当我们访问百度网站时应用层以下用到了哪些协议,包括传输层,网络层,链路层当中的协议;接下来是linux kernel的一些考查,比如内核实现printf的一系列过程,当多个进程同时使用串口时会出现乱码,此时应该如何解决;自旋锁跟其它的一些锁机制有什么不同,在性能上有哪些优势,对于不能共享的硬件资源该如何实现安全的访问.下面是对bootloader的考查,由于我对uboot源码写过注释,面试官问的时候也就没有一直问uboot的相关细节,而是问我在使用uboot当中遇到过哪些问题,是如何解决的;自己曾经使用过MCU的哪些系统外设,以及它们的通信方式.对于目前的flash,比如landflash emmc当中区别,有哪些特性,以及如何实现对landflash的坏块检测.出于我的意料之外的是他并没有问我一些编译器的相关问题.此时的一面结束了.


下面来说说终面吧,终面也是先来一次自我介绍,问一些项目经验,随机选出一个项目来考查,由于每个人的经历不一样,我被问到的是一个pid问题;接下来还是当场限时写代码环节,对方出了两道题,一道是倒三角,还一道题是检测cpu的大小端.完了之后问了一些QT的问题,当一个信号signal()连接到多个槽slot()时,哪一个slot()最先收到信号,我在这被卡死了,以前虽然用QT框架写过一些软件,但从没想过这一问题;后面是对PCB高速信号线的一些问题。


综上所述,公司很重视对算法的考查,重视对一些主流器件(FLASH,EMMC,一些MCU)的熟悉程度,重视对kernel当中的相关实现机理,对c++的要求也不算低;这次反而没有问竞赛的事情.由于这次第一回参加公司里的面试,不知道如何准备,就没有做相关准备,只是看了看C++的书籍,不过从这之后对其他公司的面试有了一个比较清晰的查漏补缺,正所谓打铁还需本身硬!

近期该做的事情:

  • 多看书多写代码,加深自己对C++的理解.
  • 找个清静的地方动手写代码去实现每一个算法书上的题!
  • 花上一个月把kernel的整体架构弄清楚,学学大牛们一样边阅读代码边写注释.发现了解内核越多对自身的帮助极大.

Linux对文件系统的支持

虽然嵌入式linux系统不是必须要有文件系统的存在,但实际上基本所有的环境下都配合使用了文件系统,而且如果没有文件系统的存在的话,linux kernel的强大功能无法实现(比如一些文件服务器一般都有大型的磁盘阵列来存放海量的数据等),因此对于文件系统我们必须有一个清楚的总体认识.
kernel和文件系统是两个独立的部分,kernel和文件系统之间通过一个标准的接口来实现,即用MTD实现VFS虚拟文件系统,不同的文件结构之间可以通过此接口来交换数据.在linux中,不同的文件系统连接成一个单一的树型结构,用一个统一的单个实体表示文件系统.linux在文件系统安装的时候,把其加载到这个单一的文件系统树上.所有的文件系统,不管什么类型,都安装在一个目录下,安装好的文件系统的文件系统的文件掩盖了这个目录原来存在的内容.这个目录叫作安装目录.当这个文件系统卸载的时候,安装目录自己的文件又可以显现出来.
在嵌入式当中,常用的文件系统有:EXT2,Cramfs,JFFS,JFFS2,NFS,ramdisk,yaffs,ubifs,有了文件系统后,接下来的问题是如何将文件系统挂载,文件系统一般都是存放在FALSH中(emmc,norflash,landflash等ROM或磁盘当中),要读取文件系统就必须要有对这些存储设备的驱动程序,kernel当中虽然有这些驱动程序,但如果把这些驱动全都以静态方式编译进内核的话无疑不符合嵌入式系统的实际拥有的极其有限的宝贵资源.所以kernel提供了一种方式:先通过initrd以及ramdisk来实现挂载root file system,即先在宿主机在做好ramdisk文件系统的映像并下载到flash中,然后bootloader把它从flash中读取到内存里,通过环境变量参数bootarg来把ramdisk.img在内存的地址以及文件系统类型等这些信息传到kernel中去.kernel启动后会在ram中拿出一块地址用于虚拟成disk,即ramdisk,然后把ramdisk.img复制过来,并且释放之前uboot用来存放ramdisk.img的内存空间.再把ramdisk.img做为root文件系统挂载,动态加载root文件系统里面的驱动程序,并初始化相应的init脚本,最终挂载其它的文件系统.


## 各文件系统的介绍 * JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。

  • JFFS22日志闪存文件系统版本2 (Journalling Flash FileSystem v2)

  主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。

  jffs不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffs文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

  • YAFFS:Yet Another Flash File System

  yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。

  yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。

yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

  • Cramfs:Compressed ROM File System

  Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。

  在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。

  Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比 Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到 RAM中。

  另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。

  由于以上特性,Cramfs在嵌入式系统中应用广泛。

  但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。

  Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。

  • RAMDISK
    Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。

  在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。

  • NFS(网络文件系统)
    NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

简介:

前几天在图书馆看到了一本吸引我眼球的书,名字叫作“Kali Linux & BackTrack渗透测试实战”,上学期也看了七,八本与此相关的书,由于当时没有写写读书笔记,很多东西都忘记了,因此今天刚把它给看完了就花点时间来写点读书笔记吧。

正文:

对于网络安全这一领域,涉及面也是非常广范,远不是成为一名脚本小子那么容易的事,光人家的入侵原理对于新手都不是一阵子能学会的,更何况是学习各种协议,各种前端开发的语言了。当然对于不把其做为自己的职业的网络爱好者来说,像php,html,javascript,python,sql这只要初步了解就行,因为每个人一天都只有24小时。在此我们就站在巨人的肩膀上来学习渗透这一学问,虽然网络工具很多,但我们主要学习的是人家的思考方式,而不是学习工具的使用,就如同一网友所讲,学好道,术只是一种解决问题的途径。
BackTrack和Kali Linux都是全球的计算机及网络精英所创所爱的操作系统,因为BackTrack系统是Kali Linux的老版本,它上面有些工具在后期不会进行更新和维护了,所以我下载的是最新的2016.1-i386版,至于安装系统,我用的u盘安装,制作启动盘也很简单,在linux下用dd命令把系统映像直接写入到u盘(插入u盘后,如果u盘在/dev目录下识别为:sdb的话,命令为:sudo dd if=kali-linux-2016.1-i386.iso of=/dev/sdb).kali linux下有很多网络工具都已经集成好了,我们学会使用就行,主要学好道,道生术,道法自然!
渗透有从内网渗透,也有从外网渗透,不管是哪一种,渗透原理都差不多,首先是信息的收集,其次是漏洞的查找,然后才可进行渗透,破密解码等入侵操作,最后就是清除入侵痕迹。
知己知彼,百战不殆。收集对方的信息,比如DNS,IP,姓名,身份证号,手机号,住址及其亲密人员的信息等,这些信息都有利于后期工作的进行。对于DNS我们可以用whois,也可以用dnsdict6,dnsmap,dnsrecon,fierce来查询,这些全是开源工具,想深入学习的话可以去下载源码进行研究。当然我们也可以在一些ips(网络服务提供商)官网,以及域名注册机构网站上进行查找。通过DNS可以查看到对方域名下活动的主机ip(一些较大公司有多个主机在工作,即多个ip对应一个域名)。有了ip之后,可以对目标主机进行端口扫描,只有通过端口才能进入对方主机进行后期操作,它好比一个窗户。如果是从内网进行渗透,还可以查看数据包所经的路由节点,对于外网渗透就没必要了。端口扫描中最出名的就是nmap了,它支持多种扫描方式,而且用TCP Half open,FIN,Xmas,Null扫描方式不会在扫描对象上留下日志记录。在扫描过程中,可以把扫描结果导出以方便查看。(还一个叫做分布式Dnmap,我平时也没用过,Dnmap是由服务器和客户端组成,服务器向客户端发送nmap命令,客户端接受命令后执行,分别执行各种检查会增加负荷,使用Dnmap就能将负荷分布到客户端,nmap的结果以日志文件的形式保存到服务器和客户端)。dmitry也是一个用来收集主机信息的工具,它利用启动时间报告和TCP端口扫描信息,简单的whois查询来获取对象主机的信息。除了以上这些收集工具,想必大家一定听对google hacking吧,对GHDB(google hacking database),利用google来收集信息,GHDB服务以数据库的形式整理了利用google查找特殊资料,致命性资料的方法,以及寻找攻击漏洞的方法。
收集好了一些必要的资料信息之后就是查找对方的漏洞了,这一工作我个人认为非常难,除非对方的漏洞及其薄弱。由于我自身在这一环节上也比较无力,今后还得多加学习此环节的知识,因此这一环节就先从简进行总结概括。收集服务漏洞在kali linux下也有很多的工具可以供我们使用,第一个就是dirbuster,用来查看对方服务器目录结构,它是以暴力破解的方式检测出隐藏在网络和应用程序的文件或目录,并以此找出攻击因子。在漏洞查找这一环节上,更多的是通过之前的端口扫描把对方的服务器类型以及版本号给扫描出来,再到网上去查看此版本以前发现了的漏洞,然后再exploit。更深入的查找是去查找客户端可见的源代码(这就要求对前端的相关语言有一定的了解)。
漏洞查找完成之后,如果找到了对方的漏洞就可以进行渗透了,否则就stop吧!这一阶断比较出名的工具就是metasploit,metasploit框架本身包涵了诸多应用程序的漏洞代码,当你所找到的漏洞也包涵在其中的话,就可以通过它进行exploit。此外再列出其它几个好用的工具:fasttrack,exploit-DB,SSLScan,digicert,SQLmap.在此记录一个文件上传漏洞吧,看到此书的作者对此情有独钟,文件上传漏洞是指利用文件上传功能验证失误来上传包含恶意代码的文件,并以此渗透系统,获取权限的攻击,多发生在具有文件附加功能的空间中;对于成功渗透进了对方系统后,还可以留下后门以便下次轻松进入对方系统当中,制作后门的工具也有不少,比如:weevely可生成web shell并利用上传到服务的文件渗透到内部系统,在远程攻击者中以telnet环境呈现。攻击OS后门:cymothoa是stealth后门工具,向已有进程插入后门shellcode,它在操作和感染进程时使用ptrace程序库。
对于清除日志文件,由于对方系统会记录下日志信息,如果不清除的话,对方管理员会查到你所做的一切,从而搜捕到你。对于老手们是修改日志文件,只把与入侵相关的记录清除,并还原timestamp,而新手有时就会忘记这一步,或者直接把日志文件全部清空。

如何将u-boot.bin写入到emmc当中

一.首先将u-boot写入SD卡中从SD卡启动

进入三星提供的u-boot源码中的/sd_fuse/tiny4412执行sd_fusing.sh

cd …/sd_fuse/tiny4412/ && sudo ./sd_fusing.sh /dev/mmcblk0
(…表示u-boot源码根目录,mmcblk0名称在不同系统中的名字有时会不一样),
然后把SD卡插入,并让开发板从SD卡启动。

二.将uboot写入emmc,并通过EMMC启动

mmcinfo 0 : 查看mmc卡信息。0 表示SD卡; 1表示emmc卡

TINY4412 # fdisk -p 1
partion # size(MB) block start # block count partition_Id
1 695 6070812 1424478 0x0C
2 320 134244 656304 0x83
3 2057 790548 4213770 0x83
4 520 5004318 1066494 0x83

格式化emmc卡 (一般分四个区)

TINY4412 # fdisk -c 1 320 809 524
Count: 10000
Count: 9999
Count: 9998
Count: 9997
fdisk is completed

partion # size(MB) block start # block count partition_Id
1 1937 3527634 3967656 0x0C
2 320 134244 656304 0x83
3 812 790548 1663134 0x83
4 524 2453682 1073952 0x83

TINY4412 # fatformat mmc 1:1
Start format MMC&d partition&d …
Partition1: Start Address(0x35d3d2), Size(0x3c8aa8)
size checking …
Under 8G
write FAT info: 32
Fat size : 0xf22
Erase FAT region………………………………………….
Partition1 format complete.
TINY4412 # ext3format mmc 1:2
Start format MMC1 partition2 ….
** Partition2 is not ext2 file-system 1 **
Partition2: Start Address(0x20c64), Size(0xa03b0)
Start ext2format…
Wirte 0/3block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x20c64
Erase inode table(0) - 0x20d24…………..
d_indirect_point:0x24874
Wirte 1/3block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x60c64
Erase inode table(1) - 0x60d24…………..
Wirte 2/3block-group
Reserved blocks for jounaling : 4102
Start write addr : 0xa0c64
Erase inode table(2) - 0xa0c74…………..
TINY4412 # ext3format mmc 1:3
Start format MMC1 partition3 ….
** Partition3 is not ext2 file-system 1 **
Partition3: Start Address(0xc1014), Size(0x19609e)
Start ext2format…
Wirte 0/7block-group
Reserved blocks for jounaling : 4102
Start write addr : 0xc1014
Erase inode table(0) - 0xc11c4……………
d_indirect_point:0xc4f64
Wirte 1/7block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x101014
Erase inode table(1) - 0x1011c4……………
Wirte 2/7block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x141014
Erase inode table(2) - 0x141024……………
Wirte 3/7block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x181014
Erase inode table(3) - 0x1811c4……………
Wirte 4/7block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x1c1014
Erase inode table(4) - 0x1c1024……………
Wirte 5/7block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x201014
Erase inode table(5) - 0x2011c4……………
Wirte 6/7block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x241014
Erase inode table(6) - 0x241024……………
TINY4412 # ext3format mmc 1:4
Start format MMC1 partition4 ….
** Partition4 is not ext2 file-system 1 **
Partition4: Start Address(0x2570b2), Size(0x106320)
Start ext2format…
Wirte 0/5block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x2570b2
Erase inode table(0) - 0x2571d2…………..
d_indirect_point:0x25acaa
Wirte 1/5block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x2970b2
Erase inode table(1) - 0x2971d2…………..
Wirte 2/5block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x2d70b2
Erase inode table(2) - 0x2d70c2…………..
Wirte 3/5block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x3170b2
Erase inode table(3) - 0x3171d2…………..
Wirte 4/5block-group
Reserved blocks for jounaling : 4102
Start write addr : 0x3570b2
Erase inode table(4) - 0x3570c2…………..

将bl1.bin, bl2.bin, u-boot.bin, tzsw.bin烧录到eMMC中

TINY4412 # emmc open 1
eMMC OPEN Success.!!
!!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is
written.!
TINY4412 # dnw 50000000
OTG cable Connected!
Now, Waiting for DNW to transmit data
Download Done!! Download Address: 0x50000000, Download
Filesize:0x2000
Checksum is being calculated.
Checksum O.K.
TINY4412 # mmc write 1 0x50000000 0 0x10

MMC write: dev # 1, block # 0, count 16 … 16 blocks written:
OK
TINY4412 # dnw 50000000
OTG cable Connected!
Now, Waiting for DNW to transmit data
Download Done!! Download Address: 0x50000000, Download
Filesize:0x3800
Checksum is being calculated.
Checksum O.K.
TINY4412 # mmc write 1 0x50000000 0x10 0x1c

MMC write: dev # 1, block # 16, count 28 … 28 blocks written:
OK
TINY4412 # dnw 0x50000000
OTG cable Connected!
Now, Waiting for DNW to transmit data
Download Done!! Download Address: 0x50000000, Download
Filesize:0x3ea64
Checksum is being calculated.
Checksum O.K.
TINY4412 # mmc write 1 0x50000000 0x30 0x21d

MMC write: dev # 1, block # 48, count 541 … 541 blocks
written: OK
TINY4412 # dnw 0x50000000
OTG cable Connected!
Now, Waiting for DNW to transmit data
Download Done!! Download Address: 0x50000000, Download
Filesize:0x17000
Checksum is being calculated.
Checksum O.K.
TINY4412 # mmc write 0x50000000 1 0x2c0 0xb8
MMC Device 1342177280: N/A
TINY4412 # mmc write 0x50000000 1 0x2c0 0xb8
MMC Device 1342177280: N/A
TINY4412 # emmc close
Usage:
Open/Close eMMC boot Partition
TINY4412 # emmc close 1
eMMC CLOSE Success.!!
在这里说下mmcwrite后面的四个参数,第一个参数:1(是指第一分区),
第二个参数:0x50000000是刚才用dnw下载到开发板RAM当中的文件地址,
第三个参数:是文件在emmc第一分区中的起始地址(以block为单位,即512B)
第四个参数:是文件所要占用的emmc空间(以block为单位,即512B)
emmc open 1 和emmc close 1是对emmc进行操作和停止操作的命令

如何在LINUX环境下对U盘进行格式化,并且可以在windows下识别呢?

在LINUX下格式化还是有一部分人没试过,下面就用几句话来概括一下。


方法:

  • 插入u盘,进入/dev下,一般对u盘的命名标志为sdb
    >cd /dev && ls

  • 对已挂载的分区进行umount
    >sudo umount /dev/sdb*

  • 对u盘进行添加/删除分区
    > sudo fdisk /dev/sdb
    » 进入fdisk后删除所分分区,再添加一个新的主分区
    »> d:为删除分区命令 n:为新建分区命令
    » w:再把分区表写入到u盘

  • 建立文件系统
    > sudo mkfs.ntfs -f /dev/sdb1


  • 完成!