Advertisement

青少年CTF平台 Lihua‘s for

阅读量:

李华刚成功掌握了C语言中的for循环语句,并迅速制作了一个crackme程序用于测试。于是他询问道:“能否解出flag?”这个题目源自于2021年强网杯青少年专项赛“Lihua's for”项目组发布的挑战内容,请将最终答案按照flag{}格式提交。

题目下载在页面顶部


先利用Die查看一下有没有加壳和是多少位的程序

发现没有加壳,是64位程序,利用IDAx64打开这个程序

在这个界面点击F5进行反编译

我将关键函数标记在图上,请稍作参考。对于某些不太明白的函数,请您可参考这篇博客文章: '文章'。

然后我们现在需要判断a中的值是什么,双击&unk_403040,查看里面是否有字符串

可以看到,在查看时发现其中有这些字符串;在反编译过程中添加断点,并通过调试手段获取a数组的值。

调试器选择Local Windows debugger

然后点击F9进行调试,会提示输入flag,随便输入即可

然后IDA就会停在这个位置

点击F5反编译

然后点击伪C中的a变量,查看里面的值

可以看出,在上文中的位置匹配到66和6D这两个标记;它们之间每隔四个字符就会出现一次;这一现象源于最初的伪C代码编写逻辑;其中a数组被定义为整数类型;它占用了4个字节的空间;我们的目标是将整个a数组的内容完整地进行复制。

将那些十六进制文本全部提出来,可以利用替换方式,将所有00替换成空

然后将他们之间的空格换为逗号

再手动修改一下

这方法已经足够接近了。不过为了实现这一目标,我打算将数据导入Python环境中进行处理。为了方便后续操作,请先将数值转换为十进制表示形式,并确保每个字符串前需添加前缀0x. 是采用替换法更好还是直接导入库函数更好?

然后将替换好的这些十六进制放在python的列表中,编写python脚本

复制代码
 a = [0x66,0x6D,0x63,0x64,0x7F,0x64,0x32,0x36,0x6A,0x6C,0x3E,0x3D,0x39,0x20,0x6F,0x3A,0x20,0x77,0x3F,0x27,0x25,0x27,0x22,0x3A,0x7A,0x2E,0x78,0x7A,0x31,0x2F,0x29,0x29,0x16,0x40,0x44,0x45,0x12,0x47,0x47,0x41,0x1A,0x54]

    
 c = ''
    
 b = 0
    
 for i in a:
    
     c += chr(b ^ i)
    
     b += 1
    
 print(c)
    
    
    
    
    python

后就可以出flag

全部评论 (0)

还没有任何评论哟~