CTF-REV-ONE_TO_TWO

EASY


DAY-9

QUESTION-1 no-strings-attached


  • 解题思路1:
    • 日常查壳,拖进IDA,\(Shift+F12\),发现全是定义的名字,没有关键串,

    • 第一行有 /lib/ld-linux.so.2 是个 \(elf\) 文件,和 \(linux\) 没跑了。

    • 打开 \(main\)\(F5\),发现全是封装好了的函数:

    • 函数功能都如其名,setlocale 设置显示窗口的字符集,banner 产品运行广告,

    • prompt_authentication 迅速验证,但点开查看只有一个输出,不予理会,,

    • authenticate 验证,看来是检验用的函数,应该会和 \(flag\) 有关,点开:

    • 发现 \(s2\) 是最后用来比较的结果,上方有一个 decrypt 解密函数将解密的数据存在其中,查看其细节:


DAY-10

QUESTION-2 dynamic


  • 解题思路:
    • 日常查壳,无事发生。拖进IDA,\(Shift+F12\),发现关键字符串 Your Flag has REencrypted.

    • 点开,\(Ctrl+x交叉引用\)\(F5\) 查看反汇编代码,发现两句话前均调用了同一个函数:

    • 简单猜想下提示意思,可能是先解密再加密,点开 sub_14001129E 发现确实是基于异或的算法:

    • 观察到两次传参 \(a2\) 都大于 \(1\),均执行 \(else\) 分支,则关注第一次调用结束后明文数据存储在哪,

    • 我们准备在函数返回前打上断点,由于本人 \(IDA\) 没配 \(gdb\),准备 \(pacth\) 后拖 \(x64gdb\) 调试。

    • 选中最后一行 return result\(Tab键\)\(右键当前行->文本视图\),找到返回前的位置:

    • 140011C24patch 一个 int 3 中断,然后保存到文件,(\(int 3的机械码是0xCC\)):


    • 如图:

    • 拖进 \(x64gdb\) 一直按 \(F9\) 直到函数调用返回时碰到 int 3 中断停止:

    • 此时观察寄存器所指的内存的值,调试器已经显示出来 \(flag\) 了:

posted @ 2024-09-29 21:19  浅叶梦缘  阅读(3)  评论(0编辑  收藏  举报