GCTF的re50反汇编分析
2015-11-17 11:24
921 查看
/*
*HeiTao_8k
*2015-11-17
*/
这是GCTF的Reverse比赛题目
一、工具
1、查壳Peid
2、吾爱破解版OD和IDA
二、分析过程
1、使用Peid查壳,发现是使用Microsoft Visual C++ 6.0写的,没有加壳。
2、在分析之前我们首先要知道这个小程序需要我干什么?打开re50.exe,是一个控制面板,需要我们输入key,判断是否正确,然后提示判断出来的结果。老规矩输入key:123456,结果什么都没提示就结束了,经过尝试,需要输入纯字母才提示错误信息,那输入key:asdfg。
3、OD和IDA结合分析,IDA载入程序,在函数窗口的函数名称下看到 _main,这就是我们写的主函数入口,点击 _main,得到函数入口点为0x00401000,然后在OD的反汇编窗口—>跟踪表达式(快捷键Ctrl+G),在弹出窗口中输入401000,确定之后跳转到对应的地址,在0x00401000处点击一下,按F4执行到光标处(即0x00401000),F8单步步过分析,图1所示为提示输入和判断字符是否超过20个字符的反汇编代码。
图1
继续一步步调试,图2所示为判断输入的字符,如果有符号和数字,则跳转到失败,结束程序,如果为纯字母的继续执行验证。
图2
图3为对输入的key进行加密
图3
图4为我们输入的key与程序的key验证,如果一一对应,则成功,否则失败。
图4
进过一步步验证,我们终于知道key了,真正的key:gctf{bbabbJbca}
三、算法分析
静态分析先找到一串 Key:
eax = *”62C5J110119120L”;
先判断了长度是否过长:
if (ecx <= 0x14) goto loc_401097;
loc_40107f:
stack[2048] = “too long”;
eax = sub_4013c0();
然后检查了一下 gctf{} 这样的基本结构:
loc_4010cb:
eax = *(int8_t *)(esp + esi + 0x18);
if ((eax == 0x7b) || (eax == 0x7d)) goto loc_4010db;
然后把输入的东西加了 0xCF 和上面那串 Key 做对比,其实已经重复检查了:
if (!COND) {
do
{
ecx = *(int8
8cf1
_t *)(esp + edx + 0x18);
*(int8_t *)(esp + edx + 0x18) = ecx + 0xcf;
ecx = ecx + 0xcf | 0xffffffff;
edx = edx + 0x1;
asm
{
repne scasb al, byte [es:edi]
};
}
while (edx < !ecx – 0x1);
}
于是得到了结果:
flag: gctf{bbabbjbca}
下载地址
链接:http://pan.baidu.com/s/1qWtb5Di 密码:ex57
注:更多文章,请关注我的个人网站
*HeiTao_8k
*2015-11-17
*/
这是GCTF的Reverse比赛题目
一、工具
1、查壳Peid
2、吾爱破解版OD和IDA
二、分析过程
1、使用Peid查壳,发现是使用Microsoft Visual C++ 6.0写的,没有加壳。
2、在分析之前我们首先要知道这个小程序需要我干什么?打开re50.exe,是一个控制面板,需要我们输入key,判断是否正确,然后提示判断出来的结果。老规矩输入key:123456,结果什么都没提示就结束了,经过尝试,需要输入纯字母才提示错误信息,那输入key:asdfg。
3、OD和IDA结合分析,IDA载入程序,在函数窗口的函数名称下看到 _main,这就是我们写的主函数入口,点击 _main,得到函数入口点为0x00401000,然后在OD的反汇编窗口—>跟踪表达式(快捷键Ctrl+G),在弹出窗口中输入401000,确定之后跳转到对应的地址,在0x00401000处点击一下,按F4执行到光标处(即0x00401000),F8单步步过分析,图1所示为提示输入和判断字符是否超过20个字符的反汇编代码。
图1
继续一步步调试,图2所示为判断输入的字符,如果有符号和数字,则跳转到失败,结束程序,如果为纯字母的继续执行验证。
图2
图3为对输入的key进行加密
图3
图4为我们输入的key与程序的key验证,如果一一对应,则成功,否则失败。
图4
进过一步步验证,我们终于知道key了,真正的key:gctf{bbabbJbca}
三、算法分析
静态分析先找到一串 Key:
eax = *”62C5J110119120L”;
先判断了长度是否过长:
if (ecx <= 0x14) goto loc_401097;
loc_40107f:
stack[2048] = “too long”;
eax = sub_4013c0();
然后检查了一下 gctf{} 这样的基本结构:
loc_4010cb:
eax = *(int8_t *)(esp + esi + 0x18);
if ((eax == 0x7b) || (eax == 0x7d)) goto loc_4010db;
然后把输入的东西加了 0xCF 和上面那串 Key 做对比,其实已经重复检查了:
if (!COND) {
do
{
ecx = *(int8
8cf1
_t *)(esp + edx + 0x18);
*(int8_t *)(esp + edx + 0x18) = ecx + 0xcf;
ecx = ecx + 0xcf | 0xffffffff;
edx = edx + 0x1;
asm
{
repne scasb al, byte [es:edi]
};
}
while (edx < !ecx – 0x1);
}
于是得到了结果:
flag: gctf{bbabbjbca}
下载地址
链接:http://pan.baidu.com/s/1qWtb5Di 密码:ex57
注:更多文章,请关注我的个人网站
相关文章推荐
- 一些通用跳转地址,XXOXX的时候有点用
- 破解电信检测,突破多用户共享上网补丁包下载
- 密码破解全教程
- VS2005 180天限制破解方法
- php下通过伪造http头破解防盗链的代码
- 使用控制台破解百小度一个月只准改一次名字
- 使用android-apktool来逆向(反编译)APK包方法介绍
- 如何使用PHP对网站验证码进行破解
- 开源操作系统和必备工具网站收集
- 全新迅雷极速版1.0原版+破解版无广告下载体验
- OD使用的一点感觉
- [Office]Office2010全系列破解工具
- [转载]Ubuntu12.10密码破解
- 常用电脑密码破解秘诀
- 股票软件破解常用破解工具介绍
- g++编译 参数 .
- 函数调用时函数栈状态分析
- 计算机的12种常用密码破解法
- 献给初学破解人的口诀和指令