题解 · Encoder

大家好我又去打CTF了~

这次想记录的题是一道逆向题,也是我第一次尝试做逆向题、看汇编(枯了)。做题时盯着汇编看了一天,一点一点用C语言高清重制,最后又盯着自己写的C代码终于看懂了算法,最后才拿到flag。解题过程中有很多东西想记录下来,所以我会分成若干篇文章来描述,然后慢慢更新到博客上,大概是按下面这样分。

  1. 题目速览
  2. 读懂汇编
  3. 算法理解
  4. 解密夺旗

那么废话不多说,这篇博客直接进入第一部分~

速览

题目叫encoder,类型为Reverse,题干是decode it!

题目提供三个文件:Makefile、encoderoutput.bin,其中Makefile并没有提供有用的信息,重点在于后面两个文件,这里也提供这两个文件的下载。

观察encoder

00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  03 00 3e 00 01 00 00 00  00 10 00 00 00 00 00 00  |..>.............|

非常明显地可以发现是一个ELF文件,(这里)是Linux下的可执行文件。

再看看output.bin

00000000  1e ce c7 be 2b a2 07 c8  12 9e 62 36 ae 73 76 c1  |....+.....b6.sv.|
00000010  f2 94 4b 68 c5 19 bd 31  de 70 eb be ad 9a fa 47  |..Kh...1.p.....G|
00000020  47 cd 01                                          |G..|

是一串被加密的数据。

看到这里已经能猜出来题目要让我们干什么了,给了一个编码器,给了一个输出结果:

echo "nactf{.......}" | ./encoder > output.bin # 出题者做的事

我们要做的就是逆向这个encoder,编写对应的decoder,然后对output应用相反的操作:

$ gcc -o decoder ./decoder.cpp
$ cat output.bin | ./decoder # 我们要做的事
nactf{.......} # 我们想要的东西

大体的思路就是这样。

反汇编

首先第一步我们得先看懂这个encoder到底做了什么,那么用objdump把它转换成汇编代码:

$ objdump -d ./encoder 

./encoder:     file format elf64-x86-64


Disassembly of section .text:
# 此处省略几十行汇编代码,会在下一篇文章给出并且分析

elf64-x86-64可以看出是一个64位程序,代码量不多,只有一个_start,没有其他C/C++程序应有的结构(比如main函数),说明程序本身是直接用汇编开发的。

关于汇编程序的分析,请见下篇文章

2020