EasyRe 153 wp - Odoiys/ctf GitHub Wiki
这道题没想到过程,有点意思。
一开始放到ida,注意到没有main函数,当时没有意识到加壳了,只是感觉不太对,上网查了wp才知道有壳。
wp上说是UPX的壳,直接脱掉。
pipe函数可用于创建一个管道,以实现进程间的通信。
pipe函数的定义如下:
#include<unistd.h>
int pipe(int fd[2]);
pipe函数定义中的fd参数是一个大小为2的一个数组类型的指针。该函数成功时返回0,并将一对打开的文件描述符值填入fd参数指向的数组。失败时返回 -1并设置errno。
通过pipe函数创建的这两个文件描述符 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据可以从 fd[0] 读出。并且 fd[1] 一端只能进行写操作,fd[0] 一端只能进行读操作,不能反过来使用。要实现双向数据传输,可以使用两个管道。
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
等于0,即在子进程中时
程序向pipedes[1]写入"69800876143568214356928753"
接收在read函数中的buf中
最后送到lol(&buf)这里执行
这里有个问题就是,所有的数字都是字符串,所以要用ascii码来计算
看py:
a1='69800876143568214356928753'
a1=list(map(ord,a1))
v2 = 2 * a1[1];
v3 = a1[4] + a1[5];
v4 = a1[8] + a1[9];
v5 = 2 * a1[12];
v6 = a1[18] + a1[17];
v7 = a1[10] + a1[21];
v8 = a1[9] + a1[25];
flag=''
for i in range(2,9):
# bing.append(locals()['v'+str(i)])
` flag+=chr(locals()['v'+str(i)])
print(locals()['v' +str(i)])
print(flag)
map(,):左边的星号是执行的函数,右边的星号是字典
locals():会以字典类型返回当前位置的全部局部变量。