假期在家无聊做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 只能蒙了。。。。