Browsed by
Month: May 2016

[Linux C]ELF Trick — 获取程序内的函数名及地址

[Linux C]ELF Trick — 获取程序内的函数名及地址

这一切的起源来自于一个群的对话: B 23:27:38 我定义了一个 C 的函数 abc_hello_world() 然后我想通过命令行通过参数 xxxxx abc hello world 把三个参数,自动作为函数名给弄进去 然后输出 那个函数的执行结果 在 C 里怎么搞啊 首先我们的第一想法都是 “宏” 网络部 R 籓绽23:29:13 我记得宏定义有一种方式可以拼接字符串吧 网络部 R 籓绽23:29:25 我没弄过 窝想想看 A 23:30:05 好像没办法实现这个,编译之后都是二进制了,函数名在优化过程中都没了 A 23:30:26 我试试宏 网络部 R 籓绽23:30:29 宏定义的确可以拼接字符串的说 网络部 R 籓绽 23:30:32 你试试看 然后, 这些抽风的程序员们感觉, 宏这种用法太无趣了(笑) 于是就有了下面这段对话 网络部 R 籓绽23:37:30 知道这个原理我们c就可以实现了吧 A 23:38:09 他是解释器,变量名会一直保存,但是 C 编译后就没有变量名了 网络部 R 籓绽 23:38:47 有的 c可以留符号表的 A  23:39:03 (⊙o⊙)…怎么做 网络部 R 籓绽 23:39:04 我们可不可以查符号表 找地址呢 网络部 R 籓绽 23:39:12 调试信息呀 B 23:39:15 查符号表地址那不就是函数指针了? 网络部 R 籓绽23:39:21 恩 网络部 R 籓绽23:39:31 先查函数名然后 网络部 R 籓绽 23:39:36 找到函数的地址…

Read More Read More

NEUOJ Tech Talk #1

NEUOJ Tech Talk #1

开始之前 First Slide , Wait till 18:30 欢迎大家来到NEUOJ Tech Talk技术交流会, 今天, 我们会将在开发东北大学学生在线测评系统(NEUOJ)中使用的种种技术, 以通俗易懂的方式,分享给热爱技术的你们, 那么在我们的Talk开始之前, 让我们首先感谢那些对我们OJ开发给出种种建议的各位同学, 并颁发我们的奖品 颁奖环节 我们有请吴老师, 为他们进行颁奖 感谢吴老师,我们的NEUOJ 持续提供给大家进行渗透测试, 安全测试的平台, 并且对成功找到并且利用我们OJ的漏洞的同学,颁发丰厚的奖品, 从32GU盘 到 2T移动硬盘, 视漏洞大小而定, 对为OJ提出宝贵建议, 报出非常有价值的bug的同学,我们会进行奖励  欢迎大家踊跃参与 那么现在, 就让我们开始吧~ [Slide 2] Tech Talk Starts 首先, 我们来了解一下,NEUOJ到底是什么 我们会先介绍 什么是Online Judge , 然后介绍 为什么我们要开发NEUOJ, NEUOJ的特点是什么, 然后会给大家展示NEUOJ的开发史 [Slide 3] 什么是OJ呢, OJ是一个可以在线编译提交的代码, 并且自动对代码的运行结果进行判断, 并且返回给用户判断之后的结果这样一个系统, O 代表Online, J代表 Judge。 我们下面来展示一下,什么是在线编译器。 [切换图片]大家可以看到,这是一个在线编译网站 codepad 的界面, 我们写了一个Hello world …, 然后选择我们的编程语言,C语言, 大家可以看到,这里支持C/C++/Haskell/PHP等多种编程语言的在线编译运行 [对这个图片进行解释], 然后当我们点击提交之后,[切换图片] 就会看到这个界面: 我们可以看到,这里已经输出了我们程序的运行结果。 这就是Online Compiler, 而Online Compiler 的功能的基础上, 再加上自动测评(Judge)的功能, 就是我们的Online Judge.[图片展示] [简单介绍] [Slide…

Read More Read More

[Linux C内核] 信号

[Linux C内核] 信号

下面对Linux 下的信号的产生, 响应机制, 以及可重入(reentrant)进行介绍~ [首先再次给网易云音乐点个赞~\(≧▽≦)/~, 在写博客的时候听着歌 而且还有歌词滚动, 真的太棒了 ~~~~] [不行, 我要附上一张截图] 恩,心满意足的窝开始写文章了 ~~ 什么是信号 在Interprocess Communication(IPC)的情形中,如何让不同的process进行通信是一个很重要的需要解决的问题, 而信号就是不同的进程之间通信的一种方式, 而在Linux下运行的每个程序, 都会受到内核的控制, 内核就通过信号告知进程一些控制信息, 如中断执行, 停止执行, 进程和进程之间也会进行信号的传递, 比如 父进程fork出的子进程, 子进程退出的时候会发送SIGCHLD信号给父进程, 告诉父进程, 我运行完啦~, 那么Linux是如何实现信号的捕捉,并且送达到相应的程序的呢? 下面我们举个具体例子来看一下 我们以最简单的情景: 用户在terminal下执行一个程序,然后由用户通过Ctrl+C打断程序的执行,返回到terminal下的整个过程中, 信号的流向进行说明  输入命令运行程序, 在Shell下启动一个前台进程, 分配了相应的PCB 程序运行过程中,用户按下 Ctrl+C, 因为有键盘输入的介入, 产生了硬件中断, CPU从用户态切换到内核态,去处理中断 终端的相应驱动程序,将Ctrl+C解释为 SIGINT信号, 并记录在当前运行在终端中的程序的PCB中 当要从内核态切换回用户态之前, 会对PCB中记录的信号, 进行处理, 检察到PCB中有 SIGINT信号, 于是对信号进行处理, 而目前这个信号的处理动作是终止进程执行, 于是这个程序终止了 信号分为实时信号和非实时信号, kill 指令后面可以接信号常量,  根据信号常量对应的数值区分实时/非实时信号 > 34的是实时信号 我们这里也值讨论 < 34的信号(即非实时的信号) 关于信号的更详细介绍, 参考 signal(7)即可 产生信号的条件 上面只说了通过Ctrl+C产生一个信号发送给进程, 那么还有什么方式产生一个信号呢? 下面列出主要的几种方式  用户在终端进行某些按键的时候,  终端驱动程序 会发送信号给相应的进程 硬件异常也会产生信号, 如当前进程执行了除以0指令, CPU的运算单元会产生异常 一个进程调用 kill 系统函数可以发送信号给某个进程, 注意这里的kill不仅仅能够kill掉某个进程, kill可以用来发送各种信号给其他的进程 当内核检测到某种软条件可以通过信号通知进程,…

Read More Read More

[go]heka插件开发

[go]heka插件开发

官方文档传送门 Heka是一个用于进行DataProcessing的一个系统, 具有高度的扩展性, 官方自称为 Swiss Army Knife 型的工具 heka通过一系列插件进行工作heka支持的插件种类有 Input Splitters Decoders Filters Encoders Outputs 六种插件 , 对于不同插件的作用, 可以在官方文档内很容易的找到, 这里就不做说明了 开发一个Input插件 heka语言的插件大部分使用 golang 开发, 下面是一个使用heka实现一个input插件, 从文件读入数据的例子 使插件能够被heka识别(注册插件到heka中) 首先, go的开发要保证GOPATH配置正确, heka安装好之后, 为heka开发插件的默认GOPATH是 /path/to/your/heka-src/build/heka/ 如果不将gopath设置为这个, 就会找不到要导入的heka有关的包 为了保证我们对插件开发的可视化, 每一步开发都能看到结果是最好的, 因而我们先尝试开发一个最最简单的插件, 只让这个插件注册到heka中, 能够确定这个插件被加载即可 参考文档: [1]http://hekad.readthedocs.io/en/v0.10.0/developing/plugin.html#registering-your-plugin [2]http://hekad.readthedocs.io/en/v0.10.0/installing.html#building-hekad-with-external-plugins 首先我们在新的GOPATH下的src/github.com/下建立自己的工作区和包目录 (我这里以./VOID001/inputplug 为例) 然后我们定义一个type 这个type就是我们的Plugin的type, 这里起名为SampleInput, 其他的名字也都可以 , 这个地方对命名没有什么约束, 下面有对名字有约束的地方, 会进行说明.  然后 将这个type实现为Plugin interface(即将 Plugin 这个interface对应的全部方法实现在type上) type SampleInputPlug struct { filePath string } func (t *SampleInputPlug) Init(config interface{}) error { return nil } 这样, 就已经实现了一个最基本的Plugin ,SampleInputPlug 指针实现了Plugin这个接口, 然后通过查看 [1]…

Read More Read More

Draft

Draft

最近真的压力山大, 好多事情在一起需要解决,而且重要程度都是同样重要, 没有办法取舍任何一项任务 不过I am VOID Just Keep VOID

voidisprogramer.com 全站启用HTTPS啦~

voidisprogramer.com 全站启用HTTPS啦~

域名备案总算OK了(生无可恋的眼神) 那么下一件事肯定是给我的WOWO启用HTTPS啦~ 首先申请了一个免费证书 大家搜索WoSign 免费证书 , 就可以找到能用两年的免费SHA256加密的合法证书哦 然后给我的httpd开启https服务 yum install mod_ssl #Install httpd-ssl mod first 因为之前没有安装mod_ssl,先安装好, 然后 在/etc/httpd.conf/下就有一个默认生成好的配置文件 ssl.conf我们打开, 修改相应的SSL证书路径, 设置为我们从上面获取到的证书的路径,然后 重启Apache, 通过https 访问https://voidisprogramer.com 发现OK~….. 不过 同时也发现了, 竟然 全站CSS还有JS图片都没法加载出来QAQ, Chrome F12看一下, 发现这些资源还都是用https://120.27.97.96这个路径去加载的,难怪加载不出来= =(证书只绑定了https://voidisprogramer.com 和 https://www.voidisprogramer.com两个域名 因而= =IP直接访问肯定不行啦)  这个问题倒不难解决, 去Wordpress后台, 的设置, 把WordpressURL, 和 站点URL都改成了 https://voidisprogramer.com即可~  [然后我发现就算改完首页banner图还有背景图的URL也没变,于是手动更新一下这两个图片的URL, 后来我发现如果把下面的步骤搞完这个根本不用管的说-0-] 恩~~ https域名访问看来没问题了~~ 那么 试试http可以访问么~ , 果然= =!http访问的话,不会定向到https下, 于是乎,下一个要解决的问题就是, 如何把http 还有 IP的直接访问,都定向到https去,这个使用了rewrite mod + NameVirtualHost的限制来实现. 首先, 我们在 /etc/httpd/conf.d/下面新建一个config文件”redirect-direct-ip-visit.conf” 然后 加入如下配置: NameVirtualHost 120.27.97.96 <VirtualHost 120.27.97.96> DocumentRoot /var/www/html/redirect-ip-http-to-https/ ServerName 120.27.97.96 </VirtualHost> 这里,我们将所有通过IP的访问, 把他们的DocumentRoot设置为了非wordpress站点所在的DocumentRoot,然后 在这个目录里新建一个 .htaccess对URL进行重写, 即可完成重定向, 重写的规则如下:…

Read More Read More

[C Linux 内核] 文件系统 #2

[C Linux 内核] 文件系统 #2

上文我们已经通过一个ext2文件系统的例子详细的查看了文件系统的各种属性, 数据是如何存储的 不过很显然有一个疑问: 如果一个inode只能存15个Block的索引项, 即之恩那个指向15个Datablock每一个Datablock大小又只是1KB, 那么一个文件的maxsize不就只有15KB了么, 下面就通过这个事实 , 对Linux ext文件系统的数据块寻址进行介绍 数据块寻址 对于我们上面那个例子里的ext2文件系统来说, 只有前面 12个块是直接指向一个存放数据的Datablock, 而 Block 12, 13, 14则都是间接寻址块  所谓间接寻址块, 就是将本来用作存储文件数据的Datablock用作inode索引(即在这个Datablock中存储的是一个个Block index记录) 在上述sample filesystem中 , 总共有三个间接寻址块, Block 12 13 14  他们之间的关系如下图所示 其中 浅蓝色表示真正存储数据的Datablock, 而浅绿色, 深绿色, 橙色 的 则表示一级, 二级, 三级Block索引, 以一级索引为例, 以及Block索引指向的是一个 Datablock, 这个Datablock 存放的是Block Index,而二级Block索引则指向一个Datablock ,这个Datablock存的是一系列的一级索引, 然后每一个一级索引又指向一个存放着Block Index的Datablock,以此类推 ,通过这个方法就大大扩充了一个文件的容量 文件&目录的操作函数 以下这些函数都是通过读取inode block, datablock 里相应的信息, 返回给调用者 / 对文件 or 目录进行操作  只对inode进行操作的(取出/修改) lstat, stat, fstat(取出) access (取出) chmod, fchmod(修改 st_mode) chown, fchown, lchown(修改user, group) utime(修改 atime, mtime) 同时对inode, datablock进行操作的 truncate, ftruncate(截断文件(既可以向短截断,也可以向长截断))…

Read More Read More

[C Linux 内核] 文件系统(以ext2为例)

[C Linux 内核] 文件系统(以ext2为例)

ext2文件系统的总体结构 每一个文件系统, 由若干个块组构成, 文件系统的最前面是大小固定(大小不能由用户指定,PC标准规定启动块大小为1KB)的一个启动快(Boot Block) 然后是若干块组, 每个块组内含有的信息为: 超级块(Super Block) 块组描述符表(Group Descriptor Table GDT) 块位图(Block Bitmap) inode位图(inode Bitmap) inode表(inode Table) 数据块(Data Block) 其中, 超级块是描述该文件系统(注意,不是该块)的基本信息,如 块大小, 文件系统版本号 等信息, 可以通过 dumpe2fs 的头部信息查看到superblock信息, 在该文件系统中,每一个块组的头部, 都有一份Superblock信息的copy 块组描述符表,  存储该块组的基本信息,每一个Block group一个 块位图, 每一个bit代表该块组中的一个块, 如果这个块被使用了, 则该bit为1 否则为0 inode位图, 和楼上类似,只不过这次每一个bit代表的是该inode块中的一个块, inode位图单独占一个块 inode表: 存储文件的基本描述信息, 如 文件类型, 权限, 大小, 文件的时间戳信息等, 都存储在inode块内, 多个inode块构成inode表, 而且特殊的, 一些不占用磁盘空间的文件 ,如 /dev/tty 这种设备文件, 内存映象文件等, 都只占用inode block,而不占用Data block 数据块: 数据块内数据的存储根据不同filetype有不同的情况:   对于regular file, 文件的数据存储在数据块中 对于目录文件, 该目录下的所有文件名和目录名存在数据块中, 注意, 一个 regular file的文件名不保存在他的数据块中, 而是保存在他目录的数据块中 对于符号链接, 如果目标路径短,则存在inode中, 否则, 要分配一个数据块来保存这个符号链接名 设备文件, FIFO socket等特殊文件没有数据块,只有inode块,…

Read More Read More