CTF逆向题中的编程技巧

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

00.png

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

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

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

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

01.png

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

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

02.png

结束进程姿势1

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

raise(9)

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

03.png

读取文件并截获版本号

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

04.png

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

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

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

05.png

结束进程姿势2

s1 /= v5 /v5 -1

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

获得CPU型号

06.png

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

07.png

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

09.png

原来是AuthenticAMD这个字符串

结束进程姿势3

.text:0000000000402832                 mov     eax, 1
.text:0000000000402837                 xor     ebx, ebx        ; status
.text:0000000000402839                 int     80h             ; LINUX - sys_exit

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

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

#define __NR_exit 1  

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

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

* 本文作者:野火研习社·陈云,转载请注明来自FreeBuf.COM

本文由 华盟网 作者:AlexFrankly 发表,其版权均为 华盟网 所有,文章内容系作者个人观点,不代表 华盟网 对观点赞同或支持。如需转载,请注明文章来源。

0

相关文章

发表评论

电子邮件地址不会被公开。