1625-5 王子昂 总结《2017年10月2日》 【连续第367天总结】
A. Reversing.kr-AutoHotKey
B.

AutoHotKey

解压出来一个ReadMe一个exe
这次的ReadMe终于看懂了,要求找到两个md5,解密后以空格连接作为flag
那么这两个md5会以什么形式出现呢……

查壳显示UPX,乖乖用工具脱掉后再运行提示“Exe corrupted”
未脱壳的程序可以正常运行,为包括文本框和两个按钮的GUI程序

那么很明显,这个提示意味着自校验
用OD逐步跟踪弹窗函数,同时以IDA辅助观察整体结构
最终找到了sub_4508C7函数中
IDA显示在上层调用中直接以它的布尔返回值来决定是否弹错误提示

动静结合分析自校验函数:

int __thiscall sub_4508C7(void *this, int a2, char *a3)
{void *file; // esi@1FILE *v4; // eax@1signed int v6; // eax@3signed int v7; // eax@5signed int i; // edx@5__int32 v9; // eax@7FILE *v10; // ST18_4@7int v11; // eax@7signed int v12; // eax@12signed int v13; // edi@19int v14; // edi@20int v15; // ecx@20signed int v16; // [sp-4h] [bp-550h]@16char v17; // [sp+Ch] [bp-540h]@1CHAR Filename; // [sp+410h] [bp-13Ch]@1char v19[16]; // [sp+518h] [bp-34h]@11char v20[8]; // [sp+528h] [bp-24h]@4char v21[8]; // [sp+530h] [bp-1Ch]@4int v22; // [sp+538h] [bp-14h]@9int v23; // [sp+53Ch] [bp-10h]@7int v24; // [sp+540h] [bp-Ch]@20__int32 v25; // [sp+544h] [bp-8h]@7char v26; // [sp+54Bh] [bp-1h]@17char *v27; // [sp+558h] [bp+Ch]@7file = this;sub_450F56(&v17);GetModuleFileNameA(0, &Filename, 0x104u);v4 = fopen(&Filename, aRb);*(_DWORD *)file = v4;if ( !v4 )return 1;v6 = 0;do{v20[v6] = byte_466514[v6];v21[v6] = byte_46650C[v6];++v6;}while ( v6 < 8 );                             // 复制十六个字节v7 = strlen(a3);*((_DWORD *)file + 68) = 0;for ( i = 0; i < v7; ++i )*((_DWORD *)file + 68) += a3[i];fseek(*(FILE **)file, -8, 2);                 // 将文件指针设置到倒数前8个字节处(2表示文件尾END,-8表示偏移offset)fread((char *)file + 4, 4u, 1u, *(FILE **)file);// 读取前4个字节存储在file+4处v9 = ftell(*(FILE **)file);v10 = *(FILE **)file;v25 = v9;                                     // 文件指针当前位置,即倒数4个字节处fread(&v23, 4u, 1u, v10);                     // 读取后4个字节放入v23中fseek(*(FILE **)file, 0, 0);v27 = 0;v11 = 0;if ( v25 > 0 ){do{if ( *(_BYTE *)(*(_DWORD *)file + 12) & 0x10 )break;fread(&v22, 1u, 1u, *(FILE **)file);v11 = sub_450F95((int)&v17, v22);         // k=*(a1 + 1024)// result = k<<8 ^ a1 + 4*(a2^(k>>24))// k=result// return result++v27;}while ( (signed int)v27 < v25 );}if ( v23 != (v11 ^ 0xAAAAAAAA) )              // v11 = k,(v22从第1字节循环到倒数第4字节)// v23=后4字节goto LABEL_25;fseek(*(FILE **)file, *((_DWORD *)file + 1), 0);// 将文件指针设置到*(file+4)即倒数第5-8字节的值处if ( !fread(v19, 0x10u, 1u, *(FILE **)file) ) // 读取16个字节入v19goto LABEL_25;v12 = 0;do{if ( v19[v12] != v20[v12] )                 // 与固定内容比较,v20\v21来自于之前的赋值break;++v12;}while ( v12 < 16 );if ( v12 != 16 ){                                             // 失败
LABEL_25:v16 = 3;
LABEL_19:v13 = v16;fclose(*(FILE **)file);return v13;}fread(&v26, 1u, 1u, *(FILE **)file);          // 读取一个字节,要求为3if ( v26 != 3 ){v16 = 4;goto LABEL_19;}fread(&v24, 4u, 1u, *(FILE **)file);          // 读4个字节放入v24v14 = v24 ^ 0xFAC1;fread((char *)file + 12, 1u, v24 ^ 0xFAC1, *(FILE **)file);// 再往后读取第(读取内容^0xfac1)个字节,放入file+12sub_450ABA((int)file + 12, v14, v14 + 50130); // 复杂计算,改变file+12处的值// 跟踪知解密出来是一串md5*((_BYTE *)file + v14 + 12) = 0;v15 = 0;for ( *((_DWORD *)file + 68) = 0; v15 < v14; ++v15 )*((_DWORD *)file + 68) += *((_BYTE *)file + v15 + 12);// 将md5的值累加至file+68*((_DWORD *)file + 2) = ftell(*(FILE **)file);return 0;
}

还是有点复杂的,需要慢慢分析
以二进制形式open自己以后,通过文件指针来灵活变换和读取
关键要注意到fread是从文件指针读取内容的API,并且会让文件指针响应后移;fseek是设置文件指针的API

大体流程:
文件最后4字节要等于一个经过复杂循环计算的值异或0xAAAAAAAA
前4字节要为一段文件中确定序列的位置,该序列为:
前16字节等于程序最初从byte_466514和byte_46650c处复制的16个字节
下1字节等于03
下4字节与0xFAC1异或,得数作为下一次读取的长度
读取刚才算出数的长度的数后,与长度+50130进行复杂运算
结果累加至一个值

要跳过弹窗的话,只需要将最后8字节改成符合要求即可
不过直接用可以通过自校验的原程序进行动态调试的过程中就能发现:

最后复杂运算的结果就是32位长度的可见字符串,估计它就是第一串md5了,用http://pmd5.com/解密可知:

isolated

下一步就是找到第二串md5了
虽然当点击OK后程序自动结束,没有任何提示
但是我们还可以断API、查看调用堆栈向上跟踪

IDA中搜索GetWindowTextA,查看交叉引用发现有很多函数,按往常的套路我猜在DialogFunc中,不过为了以防万一,还是到OD中下断吧
调用树仍然查不到信息,于是在GetDlgItemTextA和GetWindowTextA中各下断点,随便输入后点击OK,断到:

IDA中查看00425FB7,果然是DigLogFunc~

继续往下跟踪,在查看内存地址的时候不小心又看到了一处有意思的字符串:

虽然不明白是啥意思,但是这个32位可见字符串很吸引人呢,解密试试:

pawn

更稳妥一点的话,对buffer地址下访问断点,F9后可以断到某处strcmp中:

仍然是它,那么flag就是这俩组合了,提交完成

以往的题目名还能看出来一些端倪,比方说twist暗示了整个流程的恶心;WindowsKernel暗示内核驱动,这次的AutoHotKey不明白跟内容有什么关系……

C. 明日计划
reversing.kr

171002 逆向-Reversing.kr(AutoHotKey)相关推荐

  1. 171013 逆向-Reversing.kr(AutoHotKey2)

    1625-5 王子昂 总结<2017年10月13日> [连续第378天总结] A. reversing.kr B. AutoHotKey2 解压出来又来了ReadMe 不过这次比较简单,翻 ...

  2. 171019 逆向-Reversing.kr(MetroApp)

    1625-5 王子昂 总结<2017年10月19日> [连续第384天总结] A. reversing.kr B. MetroApp 这次的逆向处理了很多麻烦,学到了不少关于MetroAp ...

  3. 170929 逆向-Reversing.kr(Ransomware)

    1625-5 王子昂 总结<2017年9月29日> [连续第362天总结] A. Reversing.kr-Ransomware B. Ransomware readme提示解密文件,运行 ...

  4. 171003 逆向-Reversing.kr(CSHOP)

    1625-5 王子昂 总结<2017年10月3日> [连续第368天总结] A. Reversing.kr-CSHOP B. CSHOP 这次只有一个文件,没有可怕的ReadMe了 打开是 ...

  5. 170926 逆向-Reversing.kr(ImagePrc)

    1625-5 王子昂 总结<2017年9月26日> [连续第359天总结] A. Reversing.kr-ImagePrc B. ImagePrc 首先查壳,运行发现是一个光秃秃的窗口, ...

  6. 170925 逆向-Reversing.kr(Replace)

    1625-5 王子昂 总结<2017年9月25日> [连续第358天总结] A. Reversing.kr-Replace B. Replace 先查一波壳,还好没有 运行,是一个GUI程 ...

  7. 【reversing.kr逆向之旅】Position的writeup

    有提示是说flag就是当Serial为76876-77776时的Name    有多解    提示有四位 且最后一位是p ReversingKr KeygenMe Find the Name when ...

  8. reversing.kr学习之路-ransomeware

    ransomeware - writeup 题目来源 http://reversing.kr 题目知识点:upx + 花指令 + 堆栈不平衡 + exe特征码提取key 前言 文章只是记录一下自己在r ...

  9. 逆向工程实验——pre3(reversing.kr写题)

    reversing.kr写题 登陆网站http://reversing.kr 点击challenge选项 选一个题目完成. PEPassword 首先拿到这道题的时候我们发现有两个exe文件,开始不太 ...

最新文章

  1. 终于“打造”出了一个可以随时随地编程的工具
  2. 单片机 原子性操作_一款深藏功与名的国产单片机——F1C100A
  3. SwiftUI5.x微博入门案例第1部分
  4. STL之Vector(Linux内核)完整实现
  5. python 千万级数据处理_Python实现 ! 千万级别数据处理
  6. WIFI驱动详细设计说明书
  7. java整理快捷鍵_常用Eclipse快捷键整理
  8. 解决SQL server中提示对象名无效
  9. css 解决因为书名号不满一行就换行情况
  10. 育碧-彩虹六号如何绑定二次验证码/两步验证/身份验证?
  11. 网课搜题API接口搭建教程
  12. hdu4771 Stealing Harry Potter's Precious (状压+bfs)
  13. 将Windows电脑上的浏览器书签同步至iPad中的Safari
  14. 精英都是方法控,做人做事必备的100套思维框架工具
  15. java中如果int类型超出了它的范围
  16. 程序员应该常去的网站
  17. 前端工程化实践总结 | QQ音乐商业化Web团队
  18. css调整标签内背景图片的大小和位置
  19. 单片机作业 可乐浇汁 “苦乐交织”
  20. PRML学习总结(6)——Kernel Methods

热门文章

  1. 大数据中数据挖掘技术的挑战
  2. returned a response status of 405 Method Not Allowed
  3. edxp已激活模块_edxposed框架模块
  4. 运用java打印出菱形
  5. 华为p10 android几,华为p10国行版和海外版有什么区别 配置参数对比评测
  6. Mybatis的作用
  7. SpeechSynthesisUtterance文字转语音播报
  8. nginx重启报错:nginx: [error] open() “/usr/local/nginx/logs/nginx.pid“ failed (2: No such file or directo
  9. 程序设计阶段性总结报告一
  10. html DOM------document