实验吧逆向工程-defcamp
逆向的题目真的好难啊,发现很多逆向的题都没有几个人做出来,甚至没有人做出来,为了开始我的逆向生涯,还是先从简单题做起。
1、这次是一个bak文件,bak文件(参考百度百科https://baike.baidu.com/item/bak):
(1).bak是备份文件,为文件格式扩展名,这类文件一般在.bak前面加上应该有原来的扩展名比如windows.dll.bak,或是windows_dll.bak,有的则是由原文件的后缀名和bak混合而成,如proteus的备份文件为.DBK。
(2)很多软件都将创建备份文件设置为软件的默认配置,尤其是很多的编程、绘图、设计软件,这样的好处是当源文件不小心被删掉或是由于软件自身的BUG而导致自动退出时,还可以在备份文件的基础上继续编辑
(3)一般来讲 .bak文件可以通过直接重命名把bak替换成该文件的格式就可以恢复此文件并且正常打开了
2、kali下尝试运行,首先还是赋权限:

3、竟然真的能运行,让输入密码,随便输了一个,错误:

4、使用Ida反编译,果然也是个elf类型:

5、找到main函数,使用view-Open subviews-Generate pesudocode(或按快捷键F5)生成伪代码:

生成后:

6、可以看出代码逻辑:
for ( i = 1; i <= 10; ++i )
{
v3 = malloc(0x10uLL);
*(_DWORD *)v3 = i;
v3[4] = *(_DWORD *)v3 + 109;
a3 = (char **)qword_601080;
*((_QWORD *)v3 + 1) = qword_601080;
qword_601080 = (__int64)v3;
}
最后两句像极了链表,是的,应该是一个链表的插入操作,且为头插法。
注意这里,qword_601080始终指向链表的头,且第五位开始存取序号+109,前面几位存取序号
printf("Enter the password: ", a2, a3);
if ( fgets(&s, 7, stdin) )
{
if ( sub_40074D(&s, 7LL) )
{
puts("Incorrect password!");
result = 1LL;
}
else
{
puts("Nice!");
result = 0LL;
}
}
看这个是只要满足sub_40074D(&s,7LL)==0即可。
7、转入sub_40074D函数(双击进入):
for ( j = 0; j <= 5; ++j )
{
if ( *((_DWORD *)&v6 + j) != *(&v9 + j) )
return 1LL;
}
return 0LL;
}
首先要满足返回0,必须使 j从0到5满足:
*((_DWORD *)&v6 + j) == *(&v9 + j)
即v6和v9前六位相同。
8、v9和后面五位分别为527256(v9v10v11v12v13v14):
v6 = 0LL;
v7 = 0LL;
v8 = 0LL;
v9 = 5;
v10 = 2;
v11 = 7;
v12 = 2;
v13 = 5;
v14 = 6;
9、则要使v6也为527256(v6为int64类型):因为v6每次赋的为v4的值,v4每次为0,则要想使赋值,v4赋值的v5的值,满足if条件的即为v5后面每一位与a1相同,而注意的是v5的恰好是链表的地址,且为加109的,因此分别为114、111、116、111、114、115,转换为ASCII码:rotors
for ( i = 0; i <= 5; ++i )
{
v5 = qword_601080;
v4 = 0;
while ( v5 )
{
if ( *(_BYTE *)(v5 + 4) == *(_BYTE *)(i + a1) )
{
v4 = *(_DWORD *)v5;
break;
}
v5 = *(_QWORD *)(v5 + 8);
}
*((_DWORD *)&v6 + i) = v4;
}
10、可以试一下,也可以直接提交flag啦(不要带冒号)。
