查看: 128|回复: 1

[Reverse] 2019年8月打卡_逆向_cpp

[复制链接]
发表于 2019-9-6 12:58:14 | 显示全部楼层 |阅读模式
这道题目运行,输入11111111111 回车,程序直接关闭,没有任何提示信息

144115d71e62fd82d6.png
Exeinfo PE查壳发现是一个C++程序并且没有加壳
288565d71e63daec34.png
IDA x32载入程序 shift + F12查看有没有什么可以字符串
发现一个’Please input:’
双击进去 接着双击引用

919295d71e6581c28c.png
467545d71e65f44a11.png
程序流程图貌似很简单的样子
493455d71e66dbc370.png
F5查看伪代码
进行简单分析 Src是一个字符串数组 unsigned int是错误的
646645d71e67abbfd9.png
我们双击Src看下在程序中的位置
604175d71e684dfbfb.png

发现是在.data段也就是数据段(data segment),通常是指用来存放程序中已初始化的全局变量的一块内存区域,那Src是一个32位的全局字符串数组变量

双击sub_411302()进去 发现最后返回的是中间的参数 也就是result

118425d71e6907d36e.png

双击sub_411352() 进行分析


408855d71e69f5d812.png
接着双击sub_413910()
  1. int __usercall sub_413910@<eax>(int a1@<xmm0>, char *Str)
  2. {
  3.   char v2; // cl
  4.   size_t i; // [esp+D0h] [ebp-8h]

  5.   sub_4112F8((int)&unk_421008);
  6.   for ( i = 0; i < j_strlen(Str); ++i )         // 将Str这个字符串分为三组 分别与0x1f,0x20,0x21进行异或
  7.   {
  8.     if ( i % 3 )
  9.     {
  10.       if ( i % 3 == 1 )
  11.         v2 = Str[i] ^ 0x20;
  12.       else
  13.         v2 = Str[i] ^ 0x21;
  14.       Str[i] = v2;
  15.     }
  16.     else
  17.     {
  18.       Str[i] ^= 0x1Fu;
  19.     }
  20.   }
  21.   return sub_411302(1, (int)Str, a1);           // 最后返回a1
  22. }
复制代码
总的分析
  1. int __usercall sub_413E30@<eax>(int a1@<xmm0>)
  2. {
  3.   int v1; // eax
  4.   int v3; // [esp+0h] [ebp-CCh]

  5.   sub_4112F8((int)&unk_421008);
  6.   sub_411276(std::cout, "Please input: ");      // cout输出提示信息
  7.   scanf((const char *)&my_input, (unsigned int)Src, 32);// scanf输入  保存在Src
  8.   if ( j_strlen(Src) >= 14 && j_strlen(Src) <= 32 )// 判断Src的长度是否满足大于等于14,小于等于32 若满足,就继续
  9.   {
  10.     v1 = strcpy_s(Str, 32u, Src);               // 用strcpy_s()函数拷贝Src到Str
  11.     sub_411302(&v3 == &v3, v1, a1);
  12.     sub_411352(a1, Str);                        // 对Str进行异或操作  返回a1
  13.   }
  14.   return sub_411302(1, 0, a1);                  // 返回0 相当于return 0
  15. }
复制代码
感觉程序没有结束但就是找不到下面的代码
看了官方WP
了解到可以查看Str的引用
因为后面一直是对Str进行处理 所以可以猜测后续还会对他进行处理
779515d71e6e9333d4.png
点击任意一个Str 点击X 可以查看到第三条是还未分析的
我们双击进去 可以发现有两个Str
198465d71e6f432abb.png
这时候我们就是该找到新Str的来源 但是我的IDA好像找不到其他引用
所以换个思路
我们可以看 unk_421008 所在区域 一般都是在一块的 点击它 按X
188445d71e6ff32f21.png
可以发现向上游好多引用
一个一个看 最后可以发现最上面这个 就是我们要找的
564875d71e709468d4.png
双击可以看到
157535d71e713d8762.png
那么我们就可以编写脚本解出flag
  1. str1 = ''
  2. str2 = 'access denieda'
  3. flag = ''
  4. for i in range(len(str2)):
  5.   str1 += chr(ord(str2[i])^i)
  6. # print str1
  7. #abafwv&cmgcnhl
  8. for i in range(len(str2)):
  9.   if i % 3 == 0:
  10.     flag+= chr(ord(str1[i])^0x1f)
  11.   elif i % 3 == 1:
  12.     flag+= chr(ord(str1[i])^0x20)
  13.   elif i % 3 == 2:
  14.     flag+= chr(ord(str1[i])^0x21)
  15. print flag
  16. #~B@yWW9CLxCOwL
复制代码

总结:当没有头绪的时候,可以查看变量或字符串的引用

这道题有涉及到虚函数表的知识


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
善莫大焉-2019

0

主题

1

帖子

0

精华

初级会员

Rank: 4

学币
3
荣耀
0
rank
0
违规
0

    发表于 6 天前 | 显示全部楼层
    学习一下,谢谢
    关闭

    论坛公告上一条 /2 下一条

    快速回复 返回顶部 返回列表