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\) 了:
-