首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CTF逆向题中的编程技巧

最近一直在学习逆向相关的东西,发现了一道好玩的题目。题目难度不高,但用到了各种编程姿势。很秀!先看看题目到底是什么样的吧,这是一道2017年的bsidessf-ctf中的一道题目。

一眼就了然了,程序会比较计算机名,操作系统版本,cpu型号来给出最后的flag。

这篇文章不关注如何得到flag,关注的是出题人如何获得计算机名等信息,并怎样花式退出程序的。

使用管道进行与子进程的通信

先看获得计算机名的过程吧:

父进程创建了一个管道pipe,然后又fork了一个子进程,让子进程来使用uname -n来读取计算机名。

然后父进程等待子进程结束,再从被重定位的管道里读取计算机名

结束进程姿势1

接下来看看如果名字对不上是怎么结束进程的呢:

这个就是kill -9 +pid的意思了

读取文件并截获版本号

现在我们看程序是怎么获得操作系统信息的:

程序会读取/proc/version文件的内容,然后截取第二个空格,最后再截取到不是字母或者数字或者“.”的那一位。

如图,用红线标出的第二个空格,和后面第一个“-”号(不是字母、数字、也不是“.”)。

他们之间的字符就是程序最后读取的字符。

结束进程姿势2

一个除0异常!这也会导致进程退出!

获得CPU型号

这段程序使用了一个汇编指令cpuid,我们去调试看看它到底返回了什么

返回了这么一串东西到我们的字符串里,把他们转换成字符串:

原来是这个字符串

结束进程姿势3

int 80是linux的系统调用,至于调用什么系统调用则由eax寄存器的值决定

这里eax的值是1,查看的内容:

所以这里三条指令就是进程退出的意思了。至于int 80 具体进行系统调用的动作,又可以说一大堆了….

这里就不说了,感兴趣的可以去查阅linux内核的相关资料~~~~

文章转自FreeBuf.COM

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171221B0LBID00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券