171010 逆向-Reversing.kr(PEPassword)
来源:互联网 发布:找男妓的体验知乎 编辑:程序博客网 时间:2024/06/05 20:42
1625-5 王子昂 总结《2017年10月10日》 【连续第375天总结】
A. reversing.kr
B.
PEPassword
给了两个文件,分别是加密过的和原版的
运行原版的发现弹窗Password是??????
IDA能看到这个password的运算,稍微跑一下就出来了
不过当然它不是真正的password啦╮(╯_╰)╭
运行Packed.exe出现一个输入框,没有按钮
IDA反编译没找到有用的东西
OD断GetWindowText和GetDlgItemText也没有结果
于是乖乖单步跟随,往下几步就找到了有用的东西:
查询可知,GetMessage从消息队列中获取消息,TranslateMessage将键盘的扫描码转换成按键码,DispatchMessage则将GetMessage的消息传送给处理函数
这三个函数都是虚函数,难怪IDA找不到线索
那么我们只需要跟着Dispatch找处理函数就对啦
那个je很明显就是循环部分,如果它跳说明check失败,那么我们只需要检查这里的写入就可以了
内存写入断点是一个好方法,不过如果是判断结构的话将不经过写入断点
显然IDA的交叉引用更加有效
看,这里果然有一个写入指令,我们在OD中找到4091A8,往前几步下断
ESI中果然出现了输入的字符串,关键判断是用eax与0xe98fe42a比较
很明显sub_4091d8就是核心校验函数了
里面是一个很复杂的处理函数,逐字符循环处理0xffff次,逆变换很难;并且由于长度未知,所以穷举难度也是未知的
我们先爆破过关键跳,看看下面的内容吧
经过若干次CTRL+F9,终于回到了用户模块
果然是刚才je的地方
再往下走,经过几个函数以后直接报错
那我们就要回头挨个函数检验了
sub_409200里第一句就是常见的PUSHAD,后面开始对401000进行四字节异或操作,很明显它就是解密函数了
这里又调用了两次004091DA那个复杂的函数,结果分别放入eax和ebx中,然后以eax与401000异或,再用ebx对eax进行变换
由于我们有原函数origin.exe,拖入OD中找到401000处的机器码,于是可以得到eax序列的值,问题在于ebx是多少
这里ebx的穷举空间有0xffffffff,虽然有点大但还可以接受
拿eax的原始值和第一次变换值就可以穷举出ebx了
爆破代码(python):
ori = 0xb7aac296tar = 0x5a5a7e05def de(key): p = ori ^ key q = ror(p, (key & 0xff00) >> 8) if(q == tar): print("Correct! The password is ", hex(p)) f = open("F:\ctf\\reversing.kr\\PEPassword\\ebx.txt", 'w') f.write(hex(p)) f.close return True else: return Falsefor i in range(0xffffffff): de(i) if(i%0x10000==0): print(hex(i))
爆破代码(C):
(来源http://www.mottoin.com/88578.html,然而我的C++编辑器并无法直接用这段代码的内联汇编)
#include <stdio.h>void get_eax(int *result) { int result_eax = 0, result_ebx = 0, input_eax = result[0], input_ebx = result[1]; __asm { mov eax, input_eax mov cl, al mov ebx, input_ebx rol ebx, cl xor eax, ebx mov cl, bh ror eax, cl add ebx, eax mov result_eax, eax mov result_ebx, ebx }; result[0] = result_eax; result[1] = result_ebx;}int main() { int first_eax = 0xb7aac296; int second_eax = 0x5a5a7e05; int third_eax = 0x99c51d27; int i = 0; int result[2] = { 0 }; while (i <= 0xffffffff) { result[0] = first_eax; result[1] = i; get_eax(result); if (result[0] == second_eax) { get_eax(result); if (result[0] == third_eax) { printf("ebx:0x%p\n", i); break; } } i++; } return 0;}
这里有一点区别,我用Python写的脚本得到的ebx的值为了最简运算其实是中间量,并不是初始的ebx
而且能得到两个符合的值,正确的是0xb2f098e8
(C爆破出来的ebx初始值是0xc263a2cb)
在OD中手动修改eax和ebx后运行即可弹出flag
C. 明日计划
reversing.kr
- 171010 逆向-Reversing.kr(PEPassword)
- 170923 逆向-Reversing.kr(MusicPlayer)
- 170925 逆向-Reversing.kr(Replace)
- 170926 逆向-Reversing.kr(ImagePrc)
- 170927 逆向-Reversing.kr(Position)
- 170928 逆向-Reversing.kr(Direct3D_FPS)
- 170929 逆向-Reversing.kr(Ransomware)
- 170930 逆向-Reversing.kr(Twist)
- 171001 逆向-Reversing.kr(WindowsKernel)
- 171002 逆向-Reversing.kr(AutoHotKey)
- 171003 逆向-Reversing.kr(CSHOP)
- 171011 逆向-Reversing.kr(HateIntel)
- 171013 逆向-Reversing.kr(AutoHotKey2)
- 171014 逆向-Reversing.kr(x64 Lotto)
- 171017 逆向-Reversing.kr(CSharp)
- 171018 逆向-Reversing.kr(Flash Encrypt)
- 171019 逆向-Reversing.kr(MetroApp)
- 171020 逆向-Reversing.kr(Multiplicative)
- 新的试题
- 算法:快速排序之python实现
- SpringBoot学习(五)——整合MyBatis
- wString 截取字符串
- SpringMVC @RequestBody接收ajax json对象(字符串) (415 Unsupported media type)
- 171010 逆向-Reversing.kr(PEPassword)
- ------------------------------------
- HTML网页布局方式总结 |有码有真相|
- Spring 面向切面编程AOP
- 检测链表中的环
- 【编译原理】第四章作业
- hdu5873 Football Games
- CodeForces
- 目前最新jquery-ui-1.12.1的使用以及如何添加到自己的项目中去