在C语言中实现泛型编程

0x00 泛型编程概述

  • 泛型编程是一个非常常见的编程方式。主要目的是实现静态联编,使得函数可以接受不同类型的参数,并且在编译的时候确定正确的类型。
  • 很多语言都对泛型编程提供了支持,比如在C++中可以使用函数模版和类模版来实现泛型编程;在Java、Objective-C或者C#等单根继承的语言中,也可以使用类似java.lang.Object、NSObject等类型进行编程。在具有类型推断功能(比如Swift)的编程语言中,更是可以直接使用泛型编程。
  • 不过C语言是高级语言编程的基础语言,那如何在C语言中实现泛型编程,确实是一个问题。首先C语言不支持函数重载,不支持模版类型,所以实现起来确实比较困难。

继续阅读“在C语言中实现泛型编程”

信息安全兴趣小组-基础培训第5讲

一、Linux操作系统

  • 除了Windows系统以外,经常使用的一个系统,用于服务器、开发较多。
  • 是基于Unix的系统,实际上Linux发展到今天已经不是特指某一款操作系统,而是一个操作系统的集合。
  • 本文所说的Linux操作系统指的是“Linux发行版”。
  • Linux发行版的主要分类:
    • 基于Debian:GNU的Linux标准,软件包格式为deb。其衍生的发行版版有Ubuntu、Kali等。
    • 基于Redhat:Redhat公司的Linux标准,软件包格式为rpm。其衍生的发行版有Fedora、CentOS、openSUSE等。
    • 其他Linux系统:例如Oracle Linux。
  • Linux Kernel:Kernel即内核,内核指的是操作系统中最核心的一部分。Linux Kernel是完全开放源代码的,可以到 The Linux Kernel Archives 网站查看其源代码或者下载下来进行编译。
  • 使用环境:Linux是支持桌面GUI环境的,主要实现有GNU的GNOME桌面、KDE和Ubuntu的Unity桌面等。但是更多的时候我们是在“命令行”下使用Linux,我们称为Shell。Shell英文意为“壳”,形象的表述了Shell是Linux Kernel的外层。

继续阅读“信息安全兴趣小组-基础培训第5讲”

Java JUC学习 – ConcurrentLinkedDeque 详解

0x00 前言

  • 如何实现并发程序,对于Java以及其他高级语言来说都是一件并不容易的事情。在大一上学期的时候,我们学习了链表。可以说链表是一种很常用的数据结构了,不管是实现链式的队列和栈还是实现树都需要这种数据结构。但是在最初的时候我们并没有考虑过链表的并发问题,比如下面是一个经典的链表插入过程:

继续阅读“Java JUC学习 – ConcurrentLinkedDeque 详解”

信息安全兴趣小组 – 基础培训第2讲

一、使用专有协议和HTTP协议的C/S模式的例子

  • 这次要看代码了,不过不是让你们非要读懂代码,就是先简单看一看感受一下网络编程。通过这个例子我们将会引出一些很重要的东西来
  • 客户端概况:iOS客户端,使用的是Objective-C语言(类似于C语言)
  • 服务器端概况:Java语言编写的的服务器
  • 这里注意,什么语言不重要,以后你们会更好的领会这一点,因为编程语言都是相通的,一通则百通。

继续阅读“信息安全兴趣小组 – 基础培训第2讲”

信息安全兴趣小组 – 基础培训第1讲

一、计算机如何从网络上获取数据

  1. 总的模式是:客户端-服务器模式(C/S模式)。客户端向服务器发送请求,而服务器给客户端以回应。这个过程中两方是不对等的(两方对等的模式:P2P模式)。
  2. 服务器一般称为“云”而客户端不只局限于传统PC,智能手机、物联网设备也可以归为客户端一类,以后泛指此类设备为“计算机”。
  3. 协议:计算机之间进行通信的格式,不同的协议如果不经过特殊处理,是不能够进行通信的。
  4. C/S模式主要的优势:可以使用专用的协议,有利于保密,更安全一些。主要的劣势:受到操作系统(平台)的约束,兼容性可移植性差一些。
  5. IP地址和域名:IP地址可以唯一标示网络上的一台计算机(当然不同网络上的计算机IP地址可以相同),而域名是为了让人们容易记忆而形成的,域名通过DNS服务器解析为IP地址。
  6. B/S模式:浏览器-服务器模式,其实也是C/S模式的一种,只不过客户端是浏览器。这里的服务器一般称为HTTP服务器或者叫Web服务器。
  7. B/S模式的优势:浏览器和操作系统无关,兼容性强。劣势:安全性差,因为一般都用HTTP协议,所以容易遭受攻击。

继续阅读“信息安全兴趣小组 – 基础培训第1讲”

WriteUp – 第三届上海市大学生信息安全赛

Reverse

crackme

  • 拿到题目之后放入IDA,一开始并没注意到有壳的事,后来另一位队员起床了才告诉我。在没脱壳的情况下用IDA动态调试,在start接近return的地方下断点,单步几次之后提示EIP Points to an address which is not defined as code,点击Yes进入数据区执行代码。
  • 进入数据区之后看到输入和判断逻辑,第一次判断输入长度是否为42,更改ZF标志先绕过之后进入比对。
  • 比对部分是用输入和一个内存中的数组(mod 16逐个取)进行XOR,内存中提取该值发现是this_is_not_flag,23333,然后再和另一个数组比较。这里只需根据汇编的逻辑编写C语言代码复原一下即可得到flag。

继续阅读“WriteUp – 第三届上海市大学生信息安全赛”