关于共享内存的ctf赛题逆向程序分析

 

1.先用file命令查看文件类型,文件为64位ELF文件,剥去符号表信息。

2.用IDA打开,静态分析,F5反编译。

关于共享内存的ctf赛题逆向程序分析_第1张图片

3.分析代码,找到关键程序语句。程序通过fork函数,创建子进程。pid>0部分为父进程代码执行。由waitpid(pid, &stat_loc, 0);语句知道,父进程要等子进程结束以后再执行,那么我们先看子进程部分。

关于共享内存的ctf赛题逆向程序分析_第2张图片

4.分析子进程代码。

关于共享内存的ctf赛题逆向程序分析_第3张图片

fopen打开的*a2是argv的地址,即可以理解为argv[0],而argv[0]是程序自身的路径,即fopen打开的是程序本身。分析可知,从程序本身的第0x10000字节开始,读取8856个字节长度到“/tmp/h-magic-re”文件中,并执行该文件。接下来,我们把那个文件导出来。

5.编程导出子程序。

关于共享内存的ctf赛题逆向程序分析_第4张图片

6.分析子程序,找到关键代码逻辑。

关于共享内存的ctf赛题逆向程序分析_第5张图片

分析代码可知,a1为父程序的输入的字符串,以a1[i]的高四位为索引,将byte_201010数组中对应的值赋值给一个数组的偶数位,以a1[i]的低四位为索引,将byte_201010数组中对应的值赋值给一个数组的奇数位。而且该数组的首地址为shmaddr+1.子程序通过共享内存,把值传给父程序。下面开始分析父程序。

7.分析父程序。

关于共享内存的ctf赛题逆向程序分析_第6张图片

首先看到puts("congratulations ! you win !");这一句,所以if条件成立,再看看if语句。

关于共享内存的ctf赛题逆向程序分析_第7张图片

If语句是一个函数调用,看看函数的返回值是什么。通过分析,return语句应该是一个函数调用,dest为函数指针,v5,a2为参数,v5是shmaddr+1,即子程序加密得到的数组的首地址,a2是402.

8.内存镜像法找到dest函数。

通过GDB调试,定位到调用到dest函数的地方

关于共享内存的ctf赛题逆向程序分析_第8张图片

Rax的值即为dest函数地址,通过dd命令导出内存数据。

9.分析dest函数

关于共享内存的ctf赛题逆向程序分析_第9张图片

通过分析可知,dest函数功能是将输入的数组与dest函数里面的数组的每一个进行比较,如果相同则返回1,不相等返回0.

 

 

至此,整个程序的逻辑很清楚了。父进程输入的字符串,在子程序里进行加密,得到一个新的数组,将此数组作为dest函数的输入,判断该数组是否与dest函数里面的数组相等。根据这个,我们的目标数组为dest函数里面的数组,逆向得到输入的字符串。逆向程序如下:

关于共享内存的ctf赛题逆向程序分析_第10张图片

运行得到输入为:

Flag为

关于共享内存的ctf赛题逆向程序分析_第11张图片

你可能感兴趣的:(逆向)