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键\),\(右键当前行->文本视图\),找到返回前的位置:

-
在
140011C24行patch一个int 3中断,然后保存到文件,(\(int 3的机械码是0xCC\)):



-
如图:

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

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

-

浙公网安备 33010602011771号