BUUCTF——Reverse——[GXYCTF2019]luck_guy

1、题目

  • BUUCTF——Reverse——[GXYCTF2019]luck_guy_第1张图片

2、工具

  • Exeinfo PE:查壳工具。
  • IDA:是一款功能强大的反汇编工具,用于分析和逆向工程二进制文件。
  • python:编写自动化脚本。

3、方法

  • 下载压缩包,解压得到一个没有后缀的文件。
  • 用Exeinfo PE查询该文件是否加了壳。
    • BUUCTF——Reverse——[GXYCTF2019]luck_guy_第2张图片
    • 发现这是一个64位的.elf文件(linux),并且没有壳。
  • 使用64位的IDA将其打开。找到main函数,双击,按F5进行反汇编。
    • BUUCTF——Reverse——[GXYCTF2019]luck_guy_第3张图片
    • 主函数中要求输入一个数字,然后该数字被传入了patch_me()函数中。
  • 双击patch_me函数。
    • BUUCTF——Reverse——[GXYCTF2019]luck_guy_第4张图片
    • 如果该数字为奇数则结束,偶数则返回get_flag()函数。
  • 双击get_flag()函数。
    • BUUCTF——Reverse——[GXYCTF2019]luck_guy_第5张图片
  • 代码含义:
    • switch语句判断的条件,rand()是生成一个随机数,rand()%200则将范围定在了0~199之间。
    • switch语句中的case2、case3和default与flag无关排除。
    • case1输出的变量s应该就是flag,由f1和f2组成。双击f1得到其值为:GXY{do_not_,f2为空。
    • case4对变量s进行了赋值,然后把s拼接给了f2,其中s为十六进制长整型,存储时按照小端方式存储(高位在前),需要逆转过来。
    • case5对f2进行了处理,奇数位的字符进行-2操作,偶数位字符进行-1操作。
  • 按照题目的意思,应该是给5次机会,每次随机生成一个数字,并且恰好能够按顺序地执行case4,case5和case1。
  • 所以只需要编写脚本,顺序执行case4,case5和case1就可以了。
  • python脚本:
    • s = [0x69, 0x63, 0x75, 0x67, 0x60, 0x6f, 0x66, 0x7f]  # 小端方式
      f1 = "GXY{do_not_"
      flag = f1
      for i in range(0, len(s)):
          if i % 2 == 1:
              s[i] -= 2
          else:
              s[i] -= 1
          flag += chr(s[i])
      print(flag)
    • 运行结果:
  • 以flag{do_not_hate_me}形式提交。

你可能感兴趣的:(网络安全,网络安全)