easyre-153

发布时间 2023-11-11 21:54:01作者: 努力的大魔王

这里也是没有做出来,因为有隐藏函数的原因(第一次见)

攻防世界XCTF 3rd-RCTF-2017 easyre153学习笔记_rhelheg-CSDN博客

攻防世界逆向高手题之easyre-153-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)