CTF 逆向入门——“Love”(bugku)笔记

相关链接:

一、运行

预测是将输入的字串与 flag 进行比较,输出“wrong flag!”和“right flag!”

二、Ollydbg

将程序拖入 Ollydbg

第一步就是想查找文本字串,结果打开一看蒙了

不知道是为什么,难道是程序针对 Ollydbg 做了特殊处理?(不懂)

那么再看看函数调用

从上扫到下,注意到了最后面的 strncmp

联想到要将输入的字串和 flag 作比较,那么进去看看

这里看到了 strcmp 的一个参数——“[email protected]@dH”(395840处的注释是我自己加的)

可以看到,如果 strcmp 返回 0 ,即两字串相等,就会跳转到 goodboy。那就把这串字符输进去看看会怎么样

失败了,看来没有这么简单,看来一定是对输入的字串进行了处理,再跟
[email protected]@dH” 进行比较

往上找加密的代码,却把我看懵逼了

最后总得看出有两处对字符串的处理

一处是在
0039578F 地址处(CALL 003910BE) ,进去以后是这样

非常长,试着读了一下,发现我根本看不懂

第二处处理紧跟在 00395794 之后,如图

找这两处地方也花了我不少时间,最终放弃 Ollydbg

三、IDA PRO

正好上周五看学长演示了用 IDA PRO,这个反编译工具的伪C功能看得我眼花缭乱,于是打算试一试

拖入IDA PRO

按 shift+F12,查看所有字符串(真神奇,IDA PRO竟然都能显示出来,不知道Ollydbg 抽了什么风)

看到了“please enter the flag”,进入,看到了调用这个字符串的函数

进入函数,按 F5 看看伪C代码

看到这个觉得IDA PRO这点真强。

发现了两个对字符串的处理:第一个是 sub_4110BE 函数

另一个就在下面这个 for 循环

for 循环很好理解,直接把每一位的 ASCII 码增大其下标的数字

但是这个 sub_4110BE 函数。。。

这都是啥?

幸运的是,我得到了一点提醒,这是 base64 算法

赶紧上网查资料,发现是这样没错(可以看一下文章顶端的两个链接)

四、解密

昨天发现真的很有必要早点会 python 。但是也就刚开始看一会,写程序还是用 C 顺手。

既然输入的字串先是 base64 加密再是 for 循环处理

那么只要反着来,将
[email protected]@dH” 先用 for 循环倒着处理,再 base64 解密就可以得到 flag 了。

#include<stdio.h>
#include<string.h>

int main(void)
{
    char str[]="[email protected]@dH";
    int i=strlen(str);
    int j=i;
    for(;j>0;--j)
    {
        str[j]-=j;
    }
    printf("%s",str);
}

得到字串“醗2lfbDB2ZV95b3V9”

将这个字串进行 base64 解密,得到字串“{i_l0ve_you}”

将其输入程序

输出“right flag!”,确认这是 flag

五、总结

  1. 需要学会使用 IDA PRO 这类反编译工具,光靠调试工具在有些地方会遇到瓶颈
  2. 需要熟悉各类加密算法,例如 Base64 算法,要对这类算法有一定的敏感性
  3. 学习 python ,用 C 写脚本相对而言比较麻烦

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒