最近一直在学习逆向相关的东西,发现了一道好玩的题目。题目难度不高,但用到了各种编程姿势。很秀!先看看题目到底是什么样的吧,这是一道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
领取专属 10元无门槛券
私享最新 技术干货