【瀑布流图书源码】【imu惯性导航源码】【条烟溯源码】ncread源码

来源:最强分时源码

1.信息安全课程8:套接字(socket) 编程
2.CSerialPort教程4.3.x (2) - CSerialPort源码简介
3.请详细介绍一下vc
4.JBoss反序列化漏洞(CVE-2017-12149)

ncread源码

信息安全课程8:套接字(socket) 编程

       本文的源码socket介绍仅服务于课程目的,点到即止。源码如果希望继续深入学习socket,源码可以参照《Unix网络编程》等书籍以及参考文献。源码

       套接字(socket)允许在相同或不同的源码机器上的两个不同进程之间进行通信。更准确地说,源码瀑布流图书源码它是源码使用标准Unix文件描述符与其他计算机通信的一种方式。在Unix中,源码每个I/O操作都是源码通过写入或读取文件描述符来完成的。文件描述符只是源码与打开文件关联的整数,它可以是源码网络连接、文本文件、源码终端或其他内容。源码

       对于程序员来说,源码套接字的源码使用和行为很像更底层的文件描述符。这是因为对于套接字,read()和write()等命令可以像在文件和管道编程中同样的使用。

       套接字首先在BSD 2.1中引入,然后在BSD 4.2形成当前的稳定版本。现在,大多数最新的UNIX系统版本都提供了套接字功能。

       Unix Socket用于客户端 - 服务器应用程序框架中。服务器是根据客户端请求执行某些功能的过程。大多数应用程序级协议(如FTP、SMTP和POP3)都使用套接字在客户端和服务器之间建立连接,然后交换数据。

       用户可以使用四种类型的套接字。前两个是imu惯性导航源码最常用的,后两个使用较少。一般假定进程仅在相同类型的套接字之间进行通信,但是也没有限制阻止不同类型的套接字之间的通信。

       使用socket的时候需要使用各种结构来保存有关地址和端口的信息以及其他信息。 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。通常使用四元组来描述一个网络连接,使用socket的时候,往往也需要数据结构来描述这些信息。

       这是一个通用的套接字地址结构,在大多数套接字函数调用中都需要使用它。 成员字段的说明如下。sa_family包括以下可选值。每个值代表一种地址族(address family),在基于IP的情况中,都使用AF_INET。

       其中,sin_family和sockadd的sa_family一样,包括四个可选值:

       sin_port是端口号,位长,网络字节序(network byte order);sin_addr是IP地址,位长,网络字节序(network byte order)。sin_zero,8个字节,设置为0。

       至于为何会使用两个数据结构sockaddr和sockaddr_in来表示地址,原因是条烟溯源码如sa_family所指出的,socket设计之初本来就是准备支持多个地址协议的。不同的地址协议由自己不同的地址构造,譬如对于IPv4就是sockaddr_in, IPV6就是sockaddr_in6, 以及对于AF_UNIX就是sockaddr_un。sockaddr是对这些地址的上一层的抽象。另外,像sockaddr_in将地址拆分为port和IP,对编程也更友好。这样,在将所使用的的值赋值给sockaddr_in数据结构之后,通过强制类型转换,就可以转换为sockaddr。当然,从sockaddr也可以强制类型转换为sockaddr_in。

       在sockaddr_in中还有一个结构体,struct in_addr,就是一个位的IP地址,同样是网络字节序。

       为了允许具有不同字节顺序约定的机器相互通信,Internet协议为通过网络传输的数据指定了规范的字节顺序约定。 这称为网络字节顺序。在建立Internet套接字连接时,必须确保sockaddr_in结构的sin_port和sin_addr成员中的数据在网络字节顺序中表示。

       不用担心这几个数据结构以及字节序,因为socket接口非常贴心地准备好了各种友好的接口。

       譬如对上面描述的网站源码交付流程过程,想要把地址...和端口绑定到一个socket,以下代码就足够了:

       对于简单的socket应用编程,所需要做的就是记住流程。

       使用客户端-服务器端(client-server)模型作为一个例子。server一般打开端口,被动侦听,不需要知道客户端的IP和端口;而client发起请求,必须知道服务器端的IP和端口。

       在这个过程中,所需要用到的函数如下:

       再用一张图描述下客户端和服务器端的流程:

       接下来,我们看C/S的代码实例。

       客户端代码:

       以及服务器端代码:

       编译之后,就可以在两个进程间进行通信了。这个简单代码的作用是服务端收到客户端发来的字符串并回显。

       如果将上面代码中的while循环部分修改为:

       那么实现的功能就是两个进程之间进行输入交流。

       接下来思考问题:能不能利用上面的socket通信,获得一个shell?上面的例子中,当我们输入一个字符串,服务器给我们一个字符串,如果有了shell,发送过去一个命令,能够返回执行的结果。

       实际上,只要对上面的代码做很少的修改,就可以实现获得shell的目的。

       这里,我们稍微讨论一下,世界最牛源码以上代码到底做了什么事情。

       首先要习惯一个概念:在Linux中,一切皆文件。普通的文本文件确实是文件,但是设备、socket、管道等都被当成文件处理。所以我们获得的connfd也就是一个文件描述符。在Linux的文件描述符中有三个是特殊的,任何进程都一样的,0、1、2,分别代表标准输入,标准输出和标准出错。而它们都指向同一个tty(teleType,终端)。如果此时再去打开一个新的文件,它的文件描述符会是3。

       为了进一步理解文件描述符,可以使用下面的代码:

       能讲清楚上面代码的过程吗?下面的代码呢?

       上面的代码中,把0分别换成1、2、3有什么结果?

       下面代码的运行结果是什么呢?

       另外,能否描述shell的工作过程?

       可以再看下一个简单实现:

       以及打开shell是怎么回事呢?当我们在命令行中输入bash(调用/bin/bash)的时候,就会在shell中打开一个新的shell。所以,当使用execlp调用/bin/bash的时候,就是打开了新的shell。

       请记住,在这里我们有大量的内容没有介绍,譬如getservbyname、select、多线程、信号等。再次地,如果需要进一步学习,请参阅《unix网络编程》。

       另外: 关于AF_INET和PF_INET

       在一些文档中,可能会遇到"PF_INET"。 出现AF_INET和PF_INET是历史原因。在网络设计之初,AF = Address Family,PF = Protocol Family,所以最好在指示地址的时候使用AF,在指示协议的时候使用PF。因为那时人们希望同一个地址族( "AF" in "AF_INET" )可能支持多个协议族 ("PF" in "PF_INET" )。这样的话,就可以加以区分。

       但是,并没有出现同一个地址族支持多个协议族的情况,现在在windows中,

       所以在windows中AF_INET与PF_INET完全一样 。在Linux中,虽然 所以正确的做法是在struct sockaddr_in中使用AF_INET,以及在调用socket()时使用PF_INET。但实际上,可以在任何地方使用AF_INET。 而且,既然这就是W. Richard Stevens在他的书中所做的,那么我们这样做也毫无问题。

       至于AF_PACKET 和 PF_PACKET,可以查看源代码:

       可以发现:

       也即,值是相同的。

       利用nc实现正向shell和反向shell。正向shell:

       受害者命令:nc -lvp -e /bin/sh;也即受害者在端口侦听,并且在这个端口上执行/bin/sh;

       攻击者命令:nc ..1.2 ,也即攻击者去连端口,然后发送过去的数据在受害者主机执行,并将执行结果返回给攻击者;

       反向shell的工作方式是远程计算机将自己的shell发送给特定的用户,而不是将shell绑定到一个端口上。之所以使用反向shell,主要是因为有时候防火墙可能会阻止正向的shell。反向shell:

       攻击者侦听:nc -lvp ,攻击者打开了端口,等待连接;

       被攻击者去连接攻击者,并且同时执行/bin/sh,连上攻击者之后,攻击者发送的命令可以在受害者主机执行,执行结果返回给攻击者。

       在尝试nc -e选项的时候会出现

       也即,nc有不同的版本,需要使用nc.traditional 才能使用-e选项。

       可以使用 sudo apt-get install netcat命令,先安装nc.traditional 版本,然后使用update-alternatives来进行挑选。update-alternatives是Debian系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令、哪个软件版本。

       之后可以实现正向绑定和反向shell。

       反向shell的代码,也即在client端打开shell:

       参考:

CSerialPort教程4.3.x (2) - CSerialPort源码简介

       CSerialPort教程4.3.x (2) - CSerialPort源码简介

       本文档详细介绍了如何在MFC环境中使用CSerialPort库进行串口操作。CSerialPort是一个跨平台、轻量级的开源项目,支持多种编程语言,如C#, Java等,并遵循GNU Lesser General Public License v3.0协议。

       首先,创建一个名为CommMFC的基于对话框的MFC项目,并从CSerialPort项目网站下载源码,包括SerialPort.cpp等关键文件。确保在项目属性中添加CSerialPort头文件目录,同时注意设置cpp文件的预编译头选项,以避免编译错误。

       项目依赖于setupapi.lib库,需要在链接器设置中添加。在CommMFCDlg.h中,将CSerialPort类包含进来,使其子类化CSerialPortListener,并实现onReadEvent函数以及实例化CSerialPort对象。CCommMFCDlg的OnInitDialog和OnReceive函数将用于串口初始化、打开以及数据接收。

       在实际操作中,例如在COM2端口上,通过发送itas并接收环回数据,程序会弹出提示框显示接收到itas,数据长度为7。此教程旨在帮助开发者更轻松地集成CSerialPort到MFC项目中。

       本文参考了以下资源:CSerialPort项目地址、GitHub和Gitee仓库,以及itas的博客。

       版权所有:本内容遵循CC BY-NC-ND 4.0协议,允许署名、非商业使用且禁止演绎。

请详细介绍一下vc

       ä¸€ã€VC是什么?学VC是学什么?

       é¦–å…ˆVC是一个软件(IDE集成开发环境)(编译、编辑、调试)

       C和C++。但C++中的有些特性是不用的,例如I/O流,多态继承

       WindowsSDK(软件开发工具)

       VC的灵魂:MFC(微软基础类库)

       ATL(ActiveX模板类库)

       å…¶ä»–çš„SDK,如OpenGL,DirectX,ActiveMoive,DrawDib(WinG)

       VC是许许多多技术的综合,就好象少林般绝技,一般在应用中学会其中很少一部分就够了。我们的现在目的,其实不过是学一套少林长拳。这套长拳应包括:

       1、养成一种严谨的软件开发习惯,熟悉软件工程的基本原则。

       2、C语言基础

       3、C++最基本内容:类、继承性、封装性、多态性的概念

       4、如何用向导建立一个程序框架

       5、设计菜单

       6、设计工具条

       7、设计和使用对话框,熟悉最常用的对话框控件:按钮、静态文本、编辑框等

       8、知道怎样新建类、成员函数、成员变量、消息处理函数。

       9、了解最常用的Windows消息:如WM_PAINT(重绘窗口),鼠标按下、弹起、移动,初始化对话框,等。

       ã€äº†è§£æœ€ç®€å•çš„GDI(图形设备接口):写文字、画框、画点、画线、画圆,设置画笔、画刷。

       ã€ç†Ÿæ‚‰æœ€å¸¸ç”¨çš„MFC类:

       CWnd

       CDocument

       CView

       CDC

       CDialog

       CWinApp

       CGdiObject及子类

       CString、CPoint、CRect、CSize等简单数据类型

       CFile

       ä»¥ä¸Šæåˆ°çš„这些内容,是每个人都会用到的内容。

       äºŒã€MFC简介

       ä¸Šè¿°ä¸»è¦å†…容都是与实际操作关系非常密切的,在此不可能讲清楚;而且,这些在一般的书里都会讲到。我主要将最重要的MFC介绍一下。

       MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有多个类,但常用的也就二三十个。应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。

       ä¸‹é¢ä»‹ç»æœ€é‡è¦çš„MFC。

       CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。

       CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)

       CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。

       CDC设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。

       CDialog对话框

       CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。

       CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。

       CPen笔,画线

       CBrush刷子,填充

       CFont字体,控制文字输出的字体

       CBitmap位图

       CPalette调色板

       CRgn区域,指定一块区域可以用于做特殊处理。

       CFile文件。最重要的不外是Open(打开),Read(读入),Write(写)

       CString字符串。封装了C中的字符数组,非常实用。

       CPoint点,就是(x,y)对

       CRect矩形,就是(left,top,right,bottom)

       CSize大小,就是(cx,cy)对(宽、高)

       ä¸‰ã€ç”¨å¥½MSDN和例子

       ä½œä¸ºæé«˜ï¼ŒæŽ¨èçœ‹çš„例子有:

       nHello最简单的程序框架

       nScribble鼠标绘图。教程:编程基础,GDI

       nDiblook图像处理最简单范例

       nMFCIE因特网浏览器

       nEnroll数据库

       nDaoviewDao(数据访问对象)范例。树型和列视控件

       nCubeOpenGL范例,画一个不断旋转的方块

       nHierSvrOLE服务器

       nOclientOLE包容器

       nDrawcli鼠标绘图。也包括OLE。

       nWordPad写字板。OLE

       å››ã€å‡ ç‚¹ç»éªŒ

       A.为什么要用Windows而不是DOS编程

       Windows编程并不比DOS编程难很多,只是在刚刚接触的时候感到头绪繁多,不知从何下手。实际上,如果你会C语言,你会发现Windows编程的难度并不比当年学C语言时大。DOS编程要想成为高手,也需要学习几百个函数(无论是TC、BC、MicrosoftC),并要深入了解汇编语言级的DOS功能调用。而现在在Windows下,付出相同的工作量,你却可以获得几倍的收益。如果你以前熟悉DOS编程,现在再搞Windows编程,只要两个星期肯定会感到巨大的优越性:在DOS下,每一件事都要自己干,而且还有K内存、显示精度等的限制,实在是事倍功半了。

       B.为什么要用VC而不是其他Windows编程语言

       n大多数大型软件(包括Windows自己)都是用C、C++编的,所以可以利用的源代码特别多。例如Photoshop,就有VC的编程接口。的其他的语言都不如VC有历史优势。而且VC的开发工具特别多,从控件公司到硬件开发商,其产品很少敢不提供VC接口的。

       nVC适合组织大工程(VB就不行)

       nBorlandC++或C++Builder也很不错,并不比VC差。但BC的版本兼容性不好,从3.1到4.0就出现“代沟”,而且VC提供了极为丰富的文档和范例,VC的参考资料也远比BC多。并且VC与其他的VisualStudio成员可以协调工作,对软件工程有利。

       n

       C.开始不要学WinAPI编程,但以后最好学学WinAPI

       ç‰¹åˆ«è¦æ³¨æ„ï¼Œå¼€å§‹ä¸è¦ä¹°è®²WindowsSDK编程的书。一个臭名昭著的例子就是“HelloWorld”。各种计算机语言在入门课中往往都给出一个例子,显示一行文字“HelloWorld”,无论是在Basic、C、Pascal,甚至汇编中,这个最简单的小程序都几行就可以写完。但在早期的Windows编程中,刚才讲到的“HelloWin”这个有名的例子就要组织一个工程、写上几百行代码才能实现。这就吓跑了很多想学Windows编程的人。实际上,在Windows下显示“Helloworld”,最简单的方法只要5行就够了:

       #include“windows.h”

       voidWinMain()

       {

       MessageBox(NULL,”HelloWorld!”,”MyFirstWindowsApplication”,MB_OK);

       }

       å½“然这个程序只建立了一个最简单的对话框,但这已经够了。

       å¦‚果你没有SDK编程的经验,学VC就是要利用MFC绕过Windows编程的许多细节。有好的工具为什么不用呢?现在你在VC写一个”HelloWorld”,只要写一行代码就可以了。

       voidCYourView::OnDraw(CDC*pDC)

       {

       //…….其他的代码

       pDC->TextOut(,,”HelloWorld!”);

       }

       ä½†MFC不是万能的,WinAPI和VC中有很多功能在MFC中并不能反映出来。在入门后,要想发挥VC的完全能力,WindowsAPI还是非常重要的。而且,这些API在其他Windows语言中也用得到。

       å­¦è¯­è¨€ï¼Œä¸Žç»ƒæ­¦é“理也差不多。VC、VB、Dlphi、VFP,以及其他的Windows编程语言,都属于同一个门派:Windows门,虽然招式不同,但内功都是一样的,这就是WindowsAPI(应用编程接口),大概是两千个函数。任何武功,招式即使再复杂,通常也能在很短时间内记下来;但内功就不是一朝一夕的事。而且,各门派的内功不同,Unix、Linux门有Uinx的内功,Apple(苹果)门有Mac的内功,Java更是自成一派。我们这里说的学VC,只是学招式,学招式一个月差不多就够了,聪明的两个星期就可以掌握。光学招式,吓唬人是够了,但和高手一过招,非出丑不可。要想精通VC,必须熟悉WindowsAPI。

       D.高级语言与自然语言

       ä¸€é—¨é«˜çº§è¯­è¨€ä¸Žä¸€é—¨è‡ªç„¶è¯­è¨€æ˜¯ç±»ä¼¼çš„。关键要素有三:

       è¯­æ³•ï¼šäº†è§£C和C++基本语法,这是比较容易的。

       ä¿®è¾žï¼šç¼–程的艺术和风格。通常,这是与软件工程联系起来的。算法上的小伎俩并非是关键的。严谨,严格按照规范去做,同时又能发挥出极大的创造性,才是语言学家的本色。

       è¯æ±‡ï¼šå¦‚何利用别人的工作?如何利用自己以前的工作?这是一个软件工程师成功的关键。如果词汇量不丰富,就写不出好文章,就会有想法表达不出。一个人的语法在上小学之前就基本上学成了,修辞水平也在年轻时就确定了,惟有词汇量需要根据需要不断学习、不断扩充。VC编程中,拥有大的词汇量就意味着要掌握较多的类、函数和其他编程组件。如:WindowsSDK,MFC,以及你所专攻的领域的现成的SDK,比如3D编程中的OpenGL,多媒体编程中的DirectX,图像处理中的Victor库。另外,ActiveX控件的掌握往往也是成败的关键。我们这几年的工作也总结成了一个类库,叫IPX(图像处理框架),大大简化了图像处理的工作;不过现在还有很多细节问题要解决,如果有同学感兴趣可以参与这方面的工作。

       å­¦ä¹ VC,千万不要用我们在学校里学英语的方法,而要用小孩学说话的方法。所谓学英语的方法,就是我们在本科时学C语言的那种模式:详细搞懂每一个细节,背大量的规则,很少上机实践,没有实际问题供解决,最后由考试来断定学习成果。这种模式的后果大家都清楚:我们学了十几年英语,可有不少人还只会四五千个单词,写百把字的文章,不会说,不能听;尤其要命的是,看不懂VC的帮助文档。我们要象婴儿一样,在使用中学会语法、修辞和词汇;一开始肯定只能编出最糟糕的,就好象小孩开始只会说:“爸爸坐车车”;但“爸爸”“车车”这些词对小孩是最需要的,学习的效率反而最高。学VC的时候,应从我的需要出发,先做一个最简单的东西,然后一点一点复杂起来,象滚雪球一样。

       å­¦ä¹ VC尤其要和别人交流,你苦苦思考不明白的,也许别人早就解决了。一定要善于学习:从书店找出有用的书;向身边的高手学习;寻找可以利用的源代码、类库、组件、控件、库;如果能上互连网,那就更加能解决问题了。

JBoss反序列化漏洞(CVE--)

       JBoss存在一个严重的反序列化漏洞(CVE--),该漏洞源于HttpInvoker组件的ReadOnlyAccessFilter过滤器中的doFilter方法,该方法未经安全检查直接处理客户端提交的序列化数据,可能导致恶意用户通过精心构造的数据执行任意代码。最新发现,JBossAS 6.x版本也受此漏洞影响,攻击者无需用户验证即可获得服务器控制权。为防止潜在风险,强烈推荐尽快将系统升级至JBossAS 7版本。

       Java序列化和反序列化是Java编程中的常见操作,但若处理不当,会成为安全风险。漏洞具体表现为在HttpInvoker的源码中,doFilter函数对http中的数据直接调用readobject()进行反序列化操作。

       漏洞利用分为两个步骤:首先,通过浏览器访问目标服务器的默认页面,然后访问特定的反序列化漏洞页面,服务器会尝试解析用户提交的POST内容进行反序列化操作。攻击者可以借助ysoserial工具生成恶意序列化数据,构造Payload,利用Runtime.getRuntime().exec()的特性执行Shell命令,如bash反弹至本地指定端口。

       在利用过程中,需要注意对命令进行编码以避免被分割,同时可能利用${ IFS}字符进行绕过。实验中,通过CommonsCollections1库生成的POC文件发送至nc监听的端口,接收并执行反弹回来的Shell命令。然而,此类操作仅限于安全研究,切勿对未经授权的网站进行恶意操作。

       为了系统安全,建议对受影响的系统进行紧急修复,可以通过访问官方提供的修复文档来进行升级和配置更改。

文章所属分类:探索频道,点击进入>>