CrackMe第一天
2020-02-13 21:29:23 Author: bbs.pediy.com(查看原文) 阅读量:162 收藏

[原创]CrackMe第一天

2020-2-5 14:03 418

假期在家无聊做crackme 第一天

攻防世界的easyhook,观看管理员填写的题解时发现写的不是很清楚而且图片无法加载,所以打算自己重写一下

ida直接拖入F5,发现当我们输入字符串后,首先判断长度是否位19,为19位后在调用sub_401220,createfile,writefile, sub_401240 ,最后判断写入的字节数是否为1 ,为1则说明输入的flag正确

首先查看 sub_401220 ,首先发现是获取writefile  函数地址,记录了该地址原来的5个字节的内容,

在函数sub_4010d0在该地址处第一个写入了0xe9 即汇编指令的jmp,后四个字节写入要跳转到 00401080,再根据题目名称可以知道,sub_401220作用是将 Writefile流程转移到00401080处的函数地址上,每当调用writefile 就会调用00401080

代开od验证,在函数401220使下断点

查看原writefile处的地址,发现是jmp到系统的api处,

执行玩401220函数再次 查看 发现的确是jmp到00401080


ida查看00401080

查看401140发现是将原来的修改的代码再次修改回去,即再次调用系统的writefile

查看401000发现是第一个参数是输入的字符串,第二个是输入的长度  19,当i为机数a[i]= (a1[i]-i)^i当为偶数(a1[i+2])^i ,当i=18  a1[i]^0x13

最后和40a030处的字符挨个比较全部相等返回1否则返回0   此处的返回值为1时 *lpNumberOfBytesWritten=1

此时401080分析完毕,查看sub_401240 发现是对加密后的字符串与thisisnotflag对比  相等才是输入正确,

但是由以上分析可以得到,当NumberOfBytesWritten等于1的时候才是输入正确,所以只要将加密后的字符串与另外一个数组内容byte_40A030完全相等

NumberOfBytesWritten =1即可

#include <iostream>
using namespace std;
int main()
{
 
    char cByte[20] = { 0x61, 0x6A, 0x79, 0x67, 0x6B,0x46,0x6D,0x2E,  0x7F,0x5F,  0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38,0x6D,0x4C, 0x6E };
    char a1[0x100] = { 0 };
    for (int i = 0; i < 19; i++)
    {
        if (i == 18)
        {
            a1[i] = cByte[18] ^ 0x13;

         }
        if (i % 2)
        {
            a1[i] = (cByte[i] ^ i) + i;
        }
        else
        {
            a1[i+2] = (cByte[i] ^ i) ;
        }
    }
   
}
解出来lag{Ho0k_w1th_Fun}

猜测第一个是f 

不知道怎么解出来第一个f 只能蒙了。。。。

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!


文章来源: https://bbs.pediy.com/thread-257520.htm
如有侵权请联系:admin#unsafe.sh