新手一枚,如有错误(不足)请指正,谢谢!!
题目链接:BugkuCTF-re-file
下载地址:点击下载
ELF64文件
使用IDA64打开,进入main函数
主要运算代码为
main函数
v7 = 0;
// fllag = 'flag{hello_player_come_on_hahah}'
// sttr_home = '664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643'
for ( j = 0; j <= 63; j += 2 )
{
v3 = sttr_home[j + 1];
v13[v7++] = jisuan(sttr_home[j], sttr_home[j + 1]);
}
for ( k = 0; k < v7; ++k ) // v7 = 32
{
if ( *flllag != (k ^ v14[k] ^ v13[k]) ) // 进行运算
{
printf("Your file is wrong!! try again", v5);
return 0;
}
++flllag;
}
}
jisuan()函数
__int64 __fastcall jisuan(char a1, char a2)
{
int v2; // ebx
v2 = 16 * yunsuan(a1);
return v2 + yunsuan(a2);
}
yunsuan()函数
signed __int64 __fastcall yunsuan(char a1)
{
if ( a1 > 47 && a1 <= 57 )
return (a1 - 48);
if ( a1 > 64 && a1 <= 70 )
return (a1 - 55);
if ( a1 <= 96 || a1 > 102 )
return 0xFFFFFFFFLL;
return (a1 - 87);
}
综合一下求v14,写出c脚本
#include <stdio.h>
int yunsuan(char a1)
{
if ( a1 > 47 && a1 <= 57 )
return (a1 - 48);
if ( a1 > 64 && a1 <= 70 )
return (a1 - 55);
if ( a1 <= 96 || a1 > 102 )
return 0xFFFFFFFFLL;
return (a1 - 87);
}
int jisuan(char a1,char a2)
{
int v2;
v2 = 16*yunsuan(a1);
return v2+yunsuan(a2);
}
int main()
{
char v14[33]={0};
char flllag[] = "flag{hello_player_come_on_hahah}";
char sttr_home[] = "664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643";
int v13[64]={0},v7=0,j;
for(j=0;j<=63;j+=2)
{
v13[v7] = jisuan(sttr_home[j],sttr_home[j+1]);
v7 ++;
}
for(j=0;j<32;j++){
v14[j] = v13[j]^flllag[j]^j;
printf("%c",v14[j]);
}
return 0;
}
再将算出来的字符串转换为md5即为flag
推荐用python写,,,c语言没有像python那样简单的支持md5加密的库,
v14这字符串加密后包上flag{}即为flag
往期回顾
小白学习笔记(0) CG-CTF-re-3 py交易
小白学习笔记(1) BUUCTF-re xor
小白学习笔记(2)BUUCTF-re-新年快乐
小白学习笔记(3) CG-CT re ReadAsm2
小白学习笔记(4)BUUCTF-re-reverse_1
小白学习笔记(5)BUUCTF-re-内涵软件
小白学习笔记(6)BUUCTF-re-SimpleRev
小白学习笔记(7)BUUCTF-re-rsa
小白学习笔记(8)BUUCTF-re-CrackRTF
小白学习笔记(9)BUUCTF-re-刮开有奖
小白学习笔记(10)BUUCTF-re-Youngter-drive
小白学习笔记(11)BUUCTF-re-reverse3
小白学习笔记(12)BugkuCTF-re-游戏过关