下载附件后进行查壳如下仔细一看有壳那就脱壳喽这个是upx脱壳(上篇文章有upx脱壳教程这边就不解释了)脱完壳后拖进ida32中找到main函数然后进入这边需要了解一下pipe函数fork函数的运用这边我按我的理解解释一下pipe函数是创造一个管道用于父进程与子进程之间的通信fork函数是创造一个子进程write函数是写入字符串read函数是读取字符串pipedes[1]代表打开写入口pipedes[0]代表打开读入口write(pipedes[1],字符串0x1Du)相当于是写入字符串的前0x1Du位(先存储一下)然后read(pipedes[0],数组0x1Du)将刚才写入的字符串读取0x1Du位赋值给该数组一般找这两个函数就行其他的可以忽略了那这边根据这两个函数就可以知道数组buf了然后我们进入lol函数看看里面是对该数组怎么操作的进去之后发现只有一句话显然不对劲应该是有部分汇编语言没有反编译过来我们这边右击如图所示使用ida的同步功能然后在这个函数界面按tap再按空格就转换为汇编语言了绿色的部分代表是该函数的汇编语言一看竟然这么多显然不可能就是那么一句话那我们一句话一句话慢慢分析然后就发现问题了在最后mov [ebpvar_c],0代表给[ebpvar_c]赋值为0的意思然后下面一句话又拿他和1进行比较那这不是必然性跳跃吗显然不对那接下来只要跳过这条命令就行了在这一行右击选择nop然后我们再进入这个函数f5转换为c语言算法就出来了这边的a1数组就是上方已知的buf数组最后写个代码就得出flag了#includestdio.h int main() { char a1[] 69800876143568214356928753; //buf数组 int v2[7]; v2[0] 2 * a1[1]; v2[1] a1[4] a1[5]; v2[2] a1[8] a1[9]; v2[3] 2 * a1[12]; v2[4] a1[18] a1[17]; v2[5] a1[10] a1[21]; v2[6] a1[9] a1[25]; for (int i 0; i 7; i) { printf(%c, v2[i]); } return 0; }最后的最后最重要的一点要加上一个头RCTF{},提交一下就对了这边我们需要学会两个知识点一个是分析汇编代码学会用nop指令跳过那些必然跳跃点第二个是学会用ida的同步功能绿色部分就是该函数所对应的汇编语言,(觉得写得好可以给个赞鼓励一下我哦^_^)