这里也是没有做出来,因为有隐藏函数的原因(第一次见)
攻防世界XCTF 3rd-RCTF-2017 easyre153学习笔记_rhelheg-CSDN博客
这里提一下pipe(pipedes);
fork() 两个函数
-
(pipe(pipedes));
pipe 是个linus编程函数,是个管道,也就是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法。
#include<unistd.h>
int pipe(int filedes[2]);
pipe函数可以定义一个二元的数组,其中第一个元素只读,第二个元素只可作写操作
返回值:
成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。pipedes[0]:读管道,pipedes[1]:写管道
必须在fork()中调用pipe(),否则子进程不会继承文件描述符。两个进程不共享祖先进程,就不能使用pipe
-
fork函数:
一个进程,包括代码、数据和分配给进程的资源。
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间,然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同,相当于克隆了一个自己。
在这里着重学习一下ida没有运行函数的情况
我们会发现在这题中lol函数只有一句printf,这与我们的常识有很大的偏差
这里我们就去汇编的窗口看看代码是不是就真的如描述的这样子
先在函数这一行右键,同步到,这时候的函数在别的窗口也是绿色的了,这样子就比较明显了
然后看汇编窗口
会发现有很多的代码,说明绝对不可能是printf这么简单的
然后我们往后分析,发现代码结束的地方就存在了一个必然的跳转:
在lol函数结尾处【ebp+var_c】被赋值为0,然后与1做比较,这。。。不就是只有一个结果了吗,所以说这里可以知道zf位一直为0,发生jnz跳转
所以说上述lol函数的操作都没有太大的意义,所以ida就没有运行这个函数的内容了,这里的话我们只需要把造成永跳转的代码nop掉即可,即B0-B6的代码
再对lol函数U C P即可
写出逆向脚本即可
key1="69800876143568214356928753" flag="" flag+=chr(2*ord(key1[1])) flag+=chr(ord(key1[4])+ord(key1[5])) flag+=chr(ord(key1[8])+ord(key1[9])) flag+=chr(2*ord(key1[12])) flag+=chr(ord(key1[18])+ord(key1[17])) flag+=chr(ord(key1[10])+ord(key1[21])) flag+=chr(ord(key1[9])+ord(key1[25])) print(flag)