NKCTF2023 Reverse PMKF Writeup

NKCTF2023 Reverse PMKF Writeup

拿到题目以后发现是一个exe文件,我们直接运行一下看看,会闪过一个命令行窗口,没什么有用的信息,然后我们用Exeinfo PE打开看一看,发现没有壳,是个32位的C++程序

image-20230326213237616

所以我们直接扔进x32dbg里面看看

进去以后右键点击任意代码区域,然后选择搜索当前区域的字符串,发现以下字样

image-20230326213438742

其中很明显有wrong、you found it这种明显提示结果的字符串,这个我们一会来看。

注意到最开始有一个明显是文件路径的东西,所以我们可以猜测这个程序会从C:\nk.ctf这个文件里读出数据,所以我们就创建一个这个文件,注意C盘的根目录是不能直接创建文件的,需要从别的地方创建然后复制过来,创建之后我们随便往里面写点东西,因为题目提示写了,flag是输入的十六进制,所以我们往里面写的时候也用010editor直接写十六进制到文件里

image-20230326215627939

写好以后我们重新加载文件,再到搜索字符串的位置,这次我们来看怎么才能到Congratulations所在的位置,所以我们直接双击点进去,如下图

image-20230326214521307

然后我们从这里往上翻,就看注释和函数名即可,发现果然有一些readfile函数,而且每一次readfile后都会进行判断,都有可能会导致wrong所以我们先在第一个readfile的地方下断点看看第一次读取文件都要进行什么操作

image-20230326214755114

image-20230326214740216

image-20230326214709714

下断点以后点击几次运行,就会运行到断点处了

image-20230326215044222

大致看一下,如果不想运行到wrong,就需要在0x781113的位置跳转,而要跳转就需要eax的值为0x5,知道这些以后我们就按F8单步运行,看看eax里面的值是哪来的

运行到cmp eax,5后我们查看eax中的值发现是image-20230326215805912,正好是我们刚刚随便输入的第一个字节,因此我们猜测这个要求是我们输入的第一个字节是0x05,但这里我们先记下来,先直接双击这个值,把他改成0x5,然后继续运行

一直按F8运行,一路无事发生,一直到运行到下一个readfile

image-20230326220203759

这次还是中间会遇到wrong,只不过这次是要让eax和ecx进行比较所以我们直接运行到cmp这行,这时我们查看eax和ecx的值

image-20230326220335730

发现eax是0xFFFFFFFA,而ecx是0x6E,但给出了一个对应的字母是n,这里我们还是看不出跟我们的输入有什么关系,于是我们继续改eax,改成0x6E,先通过这次判断

通过以后发现eax被赋予了内存中的一个值,然后加了个1,这个比较容易想到应该是for循环里面的变量++操作,所以之后也是又跳回到上面了这次再运行到cmp的时候,继续看eax和ecx的值,发现一个是0xFFFFFFAE一个是0x6B对应的字母是k,这里我们发现,这个AE和刚刚的FA好像分别是我们之前输入到文件里的第二三个字节的数据,至于之前的FFFF应该是在进行右移的时候高位是1补位导致的,而进行比对的nk两个字母,可以再回去看看我们之前搜索字符串时候看到的字符串,有一个是nkman,猜测也许这里就是要输入一个,我们继续运行几轮之后发现果然就是这几个字符

到这我们可以去

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2021-2024 Kery
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信