吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2045|回复: 17

[原创] 【Reversing.kr】PEPassword

[复制链接]
发表于 2017-10-11 00:32 | 显示全部楼层
本帖最后由 whklhh 于 2017-10-11 10:59 编辑

Reversing.kr是韩国的一个逆向题目网站
有分国度的排行榜,还是挺有意思的
本题即来自于第十五关PEPassword
http://reversing.kr/challenge.php可以下载到文件


给了两个文件,分别是加密过的和原版的


运行原版的发现弹窗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):
(我自己是用了多线程,不过比较丑就不贴了_(:з」∠)_然而多线程也爆了好久)
[Python] 纯文本查看 复制代码
ori = 0xb7aac296
tar = 0x5a5a7e05

def ror(a, n):
    for i in range(n):
        p = a & 1
        a = p*0x100000000 + a >> 1
    return a

def 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 False

for i in range(0xffffffff):
    de(i)
    if(i%0x10000==0):#LOG
        print(hex(i))



爆破代码(C):
(来源http://www.mottoin.com/88578.html,然而我的C++编辑器并无法直接用这段代码的内联汇编,感觉汇编爆破的应该快些?)

[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

PEPassword.zip

29.62 KB, 下载次数: 2, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 4吾爱币 +7 热心值 +4 收起 理由
Three_fish + 1 + 1 谢谢@Thanks!
小_Ta + 1 谢谢@Thanks!
Sound + 5 + 1 已经处理,感谢您对吾爱破解论坛的支持!
lies2014 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

 楼主| 发表于 2017-10-11 10:56 | 显示全部楼层
本帖最后由 whklhh 于 2017-10-11 11:00 编辑
whyida 发表于 2017-10-11 07:40
这行代码错误。python 没“ror 这条指令。
[mw_shl_code=python,true]q = ror(p, (key & 0xff00) >> 8)[/m ...

哦哦~自己写了ror,粘漏了现在加上去了,不好意思

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

 楼主| 发表于 2017-10-11 11:02 | 显示全部楼层
whyida 发表于 2017-10-11 11:00
暴力破解还是c 快,python太费时间了。

嗯 但我的编辑器不支持附上代码形式的内联汇编 就很神奇_(:з」∠)_似乎只能用AT&T记法的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-10-11 07:40 | 显示全部楼层
这行代码错误。python 没“ror 这条指令。
[Python] 纯文本查看 复制代码
q = ror(p, (key & 0xff00) >> 8)

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-10-11 08:23 | 显示全部楼层
高手为国争光!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-10-11 08:33 | 显示全部楼层
大神,我看好你哦

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-10-11 09:28 | 显示全部楼层
学习一下……

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-10-11 11:00 | 显示全部楼层
whklhh 发表于 2017-10-11 10:56
哦哦~自己写了ror,粘漏了不好意思

暴力破解还是c 快,python太费时间了。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

发表于 2017-10-11 11:06 | 显示全部楼层
whklhh 发表于 2017-10-11 11:02
嗯 但我的编辑器不支持附上代码形式的内联汇编 就很神奇_(:з」∠)_似乎只能用AT&T记法的

精简版 vs 2008,vs 2013都能编译。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

 楼主| 发表于 2017-10-11 11:20 | 显示全部楼层
whyida 发表于 2017-10-11 11:06
精简版 vs 2008,vs 2013都能编译。

我用的CodeBlocks + MinGw

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则


免责声明:
吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Service@52PoJie.Cn

快速回复 收藏帖子 返回列表 搜索

RSS订阅|手机版|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2017-12-13 09:18

Powered by Discuz!

© 2001-2017 Comsenz Inc.

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