我们直接将Linux当前日期设置为2012-12-21,运行文件就能得到flag,不过还是要分析一下。

1.准备

获取信息

64位文件

2.IDA打开

主函数main

signed __int64 __fastcall main(__int64 a1, char **a2, char **a3)

{

size_t v3;//rbx

size_t v4; //rax

unsigned __int64 v6; //rax

unsigned __int64 v7; //rax

unsigned __int64 v8; //rsi

char *v9; //rdi

time_t timer; //[rsp+18h] [rbp-128h]

char v11[8]; //[rsp+20h] [rbp-120h]

char src; //[rsp+40h] [rbp-100h]

char s; //[rsp+60h] [rbp-E0h]

unsigned __int64 v14; //[rsp+C8h] [rbp-78h]

char v15; //[rsp+D4h] [rbp-6Ch]

char v16; //[rsp+DDh] [rbp-63h]

char v17; //[rsp+E6h] [rbp-5Ah]

char v18; //[rsp+EFh] [rbp-51h]

char *v19; //[rsp+F8h] [rbp-48h]

char *v20; //[rsp+100h] [rbp-40h]

char *v21; //[rsp+108h] [rbp-38h]

char *dest; //[rsp+110h] [rbp-30h]

int *v23; //[rsp+118h] [rbp-28h]

size_t v24; //[rsp+120h] [rbp-20h]

struct tm *tp; //[rsp+128h] [rbp-18h]

strcpy(v11,".fluxfingers.net");

timer=time(0LL);

tp= localtime(&timer);

strftime(&s, 99uLL, "%Y-%m-%d", tp); //将现在的日期放入s

v24 = strlen(&s); //v24=99

sub_B5A(&s, v24); //将日期s进行MD5加密

v23 = &dword_2030B8; //v23为加密后的日期的一部分

snprintf(&v18,

9uLL,"%02x%02x%02x%02x",

(unsigned __int8)dword_2030B8,

BYTE1(dword_2030B8),

BYTE2(dword_2030B8),

HIBYTE(dword_2030B8));

v23= &dword_2030C0;

snprintf(&v17,

9uLL,"%02x%02x%02x%02x",

(unsigned __int8)dword_2030C0,

BYTE1(dword_2030C0),

BYTE2(dword_2030C0),

HIBYTE(dword_2030C0));

v23= &dword_2030B4;

snprintf(&v16,

9uLL,"%02x%02x%02x%02x",

(unsigned __int8)dword_2030B4,

BYTE1(dword_2030B4),

BYTE2(dword_2030B4),

HIBYTE(dword_2030B4));

v23= &dword_2030BC;

snprintf(&v15,

9uLL,"%02x%02x%02x%02x",

(unsigned __int8)dword_2030BC,

BYTE1(dword_2030BC),

BYTE2(dword_2030BC),

HIBYTE(dword_2030BC));

snprintf(&src, 33uLL, "%s%s%s%s", &v18, &v17, &v16, &v15);//src为加密后的日期

v3 = strlen(&src); //v3=33

v4 = strlen(v11); //v4=16

dest = (char *)malloc(v3 + v4 + 1);if ( !dest )return1LL;*dest = 0;

strcat(dest,&src);

strcat(dest, v11);//dest为MD5(s)+".fluxfingers.net"

v21 =sub_18A4(dest);if ( !v21 )return1LL;

v6=strlen(v21);

v20= sub_15E0((__int64)v21, v6, &v14); //base64解密

v7 =strlen(v21);

v19= sub_15E0((__int64)v21, v7, &v14);if ( !v20 )return1LL;

v8=v14;

v9=v20;

sub_1858((__int64)v20, v14, (__int64)v19);//异或0x25

((void (__fastcall *)(char *, unsigned __int64))v19)(v9, v8);return0LL;

}

3.代码分析

3.1 MD5加密

首先,程序将获取到的时间进行了MD5码加密

for ( i = 8 * a2 + 1; i % 512 != 448; ++i )

;

v2=i;

i/= 8;

dest= calloc(v2 / 8 + 64, 1uLL);

memcpy(dest, a1, a2);//将a1中的值存入dest中

*((_BYTE *)dest + a2) = -128;*(_DWORD *)((char *)dest + i) = 8 *a2;for ( j = 0; j < i; j += 64)

{

v132= (char *)dest +j;

v140=dword_2030B8;

v139=dword_2030C0;

v138=dword_2030B4;

v137=dword_2030BC;for ( k = 0; k <= 0x3F; ++k ) //MD5码加密

{if ( k > 0xF)

{if ( k > 0x1F)

{if ( k > 0x2F)

{

v135= v138 ^ (v139 | ~v137);

v134= 7 * (_BYTE)k & 0xF;

}else{

v135= v137 ^ v138 ^v139;

v134= (3 * (_BYTE)k + 5) & 0xF;

}

}else{

v135= v139 & v137 | v138 & ~v137;

v134= (5 * (_BYTE)k + 1) & 0xF;

}

}else{

v135= v138 & v139 | v137 & ~v139;

v134=k;

}

v131=v137;

v137=v138;

v138=v139;

v139+= __ROL4__(*(_DWORD *)&v132[4 * v134] + *(&v3 + k) + v135 + v140, *(&v67 +k));

v140=v131;

}

dword_2030B8+=v140;

dword_2030C0+=v139;

dword_2030B4+=v138;

dword_2030BC+=v137;

}free(dest);

}

3.2 连接字符串

将加密后的时间与“.fluxfingers.net”结合

snprintf(&src, 33uLL, "%s%s%s%s", &v18, &v17, &v16, &v15);//src为加密后的日期

v3 = strlen(&src); //v3=33

v4 = strlen(v11); //v4=16

dest = (char *)malloc(v3 + v4 + 1);if ( !dest )return1LL;*dest = 0;

strcat(dest,&src);

strcat(dest, v11);//dest为MD5(s)+".fluxfingers.net"

3.3 传递处理

将得到的字符串传入  v21 = sub_18A4(dest);处理

char *__fastcall sub_18A4(const char *a1)

{char *v2; //rax

ns_rr v3; //[rsp+10h] [rbp-24A0h]

ns_msg v4; //[rsp+430h] [rbp-2080h]

char s; //[rsp+480h] [rbp-2030h]

u_char v6; //[rsp+1480h] [rbp-1030h]

char *dest; //[rsp+2488h] [rbp-28h]

size_t n; //[rsp+2490h] [rbp-20h]

char *v9; //[rsp+2498h] [rbp-18h]

char *src; //[rsp+24A0h] [rbp-10h]

int v11; //[rsp+24ACh] [rbp-4h]

v11= __res_query(a1, 1, 16, &v6, 4096); //字符串作为查询域名传入,返回消息的长度

if ( v11 < 0)return0LL;

ns_initparse(&v6, v11, &v4); //获得控制句柄

v11 = v4._counts[1];

ns_parserr(&v4, ns_s_an, 0, &v3); //解析具体区域获取记录类型数据

ns_sprintrr(&v4, &v3, 0LL, 0LL, &s, 0x1000uLL);//将字段转换为演示文稿格式

v2 = strchr(&s, 34);

src= v2 + 1;if ( v2 == (char *)-1LL )return0LL;

v9= strchr(src, 34);if ( !v9 )return0LL;

n= v9 -src;

dest= (char *)malloc(v9 - src + 1);

strncpy(dest, src, n);

dest[n]= 0;returndest;

}

3.4 base64解密

再对得到的字符串进行base64解密

v6 =strlen(v21);

v20= sub_15E0((__int64)v21, v6, &v14); //base64解密

v7 =strlen(v21);

v19= sub_15E0((__int64)v21, v7, &v14);

char *__fastcall sub_15E0(__int64 a1, unsigned __int64 a2, _QWORD *a3)

{char *v4; //rax

char *v5; //rax

char *v6; //rax

_QWORD *v7; //[rsp+8h] [rbp-158h]

char v8; //[rsp+28h] [rbp-138h]

unsigned __int8 v9; //[rsp+29h] [rbp-137h]

unsigned __int8 v10; //[rsp+2Ah] [rbp-136h]

char v11; //[rsp+2Bh] [rbp-135h]

char v12[2]; //[rsp+2Ch] [rbp-134h]

char v13; //[rsp+2Eh] [rbp-132h]

char v14; //[rsp+2Fh] [rbp-131h]

char s[61]; //[rsp+30h] [rbp-130h]

char v16; //[rsp+6Dh] [rbp-F3h]

char v17; //[rsp+13Fh] [rbp-21h]

char *v18; //[rsp+140h] [rbp-20h]

size_t size; //[rsp+148h] [rbp-18h]

unsigned __int64 i; //[rsp+150h] [rbp-10h]

char *v21; //[rsp+158h] [rbp-8h]

v7=a3;

memset(s,128, 0x100uLL);for ( i = 0LL; i <= 0x3F; ++i )

s[(unsigned __int8)aAbcdefghijklmn[i]]= i; //base64解密

v16 = 0;

size=0LL;for ( i = 0LL; i < a2; ++i )

{if ( s[*(unsigned __int8 *)(a1 + i)] != -128)++size;

}if ( size & 3)return0LL;

v18= (char *)malloc(size);

v21=v18;if ( !v18 )return0LL;

size=0LL;for ( i = 0LL; i < a2; ++i )

{

v17= s[*(unsigned __int8 *)(a1 +i)];if ( v17 != -128)

{

v12[size]= *(_BYTE *)(a1 +i);*(&v8 + size++) =v17;if ( size == 4)

{

v4= v21++;*v4 = (v9 >> 4) | 4 *v8;

v5= v21++;*v5 = (v10 >> 2) | 16 *v9;

v6= v21++;*v6 = v11 | (v10 << 6);

size=0LL;

}

}

}if ( v21 >v18 )

{if ( v13 == 61)

{

v21-= 2;

}else if ( v14 == 61)

{--v21;

}

}*v7 = v21 -v18;returnv18;

}

View Code

.rodata:0000000000001E80 aAbcdefghijklmn db 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/%'

3.5 异或操作

最后对解密后的字符串进行异或0x25

unsigned __int64 __fastcall sub_1858(__int64 a1, unsigned __int64 a2, __int64 a3)

{

unsigned __int64 result;// rax

unsigned __int64 i;// [rsp+20h] [rbp-8h]

for ( i = 0LL;; ++i )

{

result = i;if ( i >= a2 )

break; *(_BYTE *)(a3 + i) = *(_BYTE *)(a1 + i) ^ 0x25;}

return result;}

3.6 总结

实际上就是将获得的日期date进行

base64(sub_18A4(MD5(date)+".fluxfingers.net")).decode() ^ 0x25

因此我们获取到正确时间即可。联系到玛雅社会,最出名的就是玛雅预言,因此我们可以判断这个时间就是2012-12-21

4.get flag!

flag{e3a03c6f3fe91b40eaa8e71b41f0db12}

m4枪 maya_攻防世界--The_Maya_Society相关推荐

  1. 【攻防世界001】Guess-the-Number

    攻防世界之前刷了几十题了,没写wp,感觉很简单没啥意思.后来参加了几次比赛,发现有点干不动,决定还是老老实实刷题好了.这是第一篇wp,这题很简单,是个jar,用jd-gui可以得到java源码. 原来 ...

  2. 攻防世界(pwn)--Mary_Morton 利用格式化字符串+栈溢出破解Canary的保护机制

    ctf(pwn) canary保护机制讲解 与 破解方法介绍 程序执行流程 有三个选项,1是利用栈溢出,2是利用格式化字符串,3是退出;可连续输入多次; IDA分析 解题思路 程序存在canary保护 ...

  3. 攻防世界(Pwn) forgot---栈溢出;(方法二)

    攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...

  4. 攻防世界(Pwn) forgot---栈溢出;(方法一)

    攻防世界(Pwn) forgot-栈溢出:(方法二) 介绍 这道题表面看起来有点复杂,其实很简单,有两种方法可以来做这一道题; 方法一(精确打击) 文件运行流程是: 1.先输入名字 2. 输入一串字符 ...

  5. 攻防世界misc新手_[攻防世界]mobile新手练习区easy-apk

    [攻防世界]mobile新手练习区easy-apk easy-apk最佳Writeup由129师386旅独立团 • devi1提供 难度系数: 7.0 题目来源: 暂无 题目描述:无 题目场景: 暂无 ...

  6. 攻防世界 ——crypto

    目录 新手区部分题解: 1,easy_RSA 2,Normal_RSA 3, 幂数加密 4,easy_ECC 高手进阶区部分题题解 5, ENC 6,告诉你个秘密 7,Easy-one 8,说我作弊需 ...

  7. 攻防世界———MISC 高手区题解

    目录 1,base64stego 2,easycap 3,Avatar 4,What-is-this 5,签到题 6,Training-Stegano-1 7,Excaliflag 8,Get-the ...

  8. 攻防世界 web(二)

    这周接着刷攻防世界的web题( ̄︶ ̄)↗ 1.command_execution 看提示这题为命令执行漏洞(command_execution),关于命令执行漏洞,我前面有篇博客详细介绍了,大家不了解 ...

  9. misc高阶 攻防世界_攻防世界 Misc 进阶题(一)

    攻防世界 Misc 进阶题(一) 关于隐写术的思路或方法 转载: https://blog.csdn.net/a_small_rabbit/article/details/79644078     隐 ...

最新文章

  1. web前端技术框架选型参考
  2. 【设计思想解读开源框架】java如何发送post请求
  3. 十大经典排序算法之希尔排序及其优化
  4. Rust中文论坛已更新上线
  5. ltrim函数_常用基础函数
  6. 制作新网络框架快速自动生成消息结构体的编辑器
  7. java criteria exist_Java Criteria.addExists方法代碼示例
  8. 1088 三人行 (20 分)
  9. go语言mysql删除记录_MySQL数据库删除操作-Go语言中文社区
  10. 精通数据科学_10篇文章变得更加精通数据科学
  11. git tig使用技巧_如何使用Tig浏览Git日志
  12. python replace函数后面的数字的含义
  13. 开发中常用的加密算法大全初步总结
  14. MySQL常用命令_vortex_新浪博客
  15. 完美解决 Ubuntu 18.04 安装网易云音乐 不能正常点击启动问题
  16. webui-popover 一个轻量级的jquery弹出层插件
  17. GAMES101 Rasteriztion
  18. python录音转文字软件_录音提取转文字
  19. 基于STM32F429的DCMI实现OV7725-NF无缓存摄像头的图像采集HAL库
  20. 英语计算机四级如何查询,四级成绩查询

热门文章

  1. 韦玮:解决Ubuntu的root账号无法登录SSH问题-Permission denied, please try again.
  2. 单片机发射红外c语言程序,STC单片机51简单的红外遥控发射程序C语言
  3. 计算机专业需要物理力学,物理不好的同学,千万不要报考这些专业,很容易挂科!...
  4. 这可能是最精简的Android6.0运行时权限处理,百行代码的工具类,支持Rationale,附:各种权限详细处理
  5. 360道软件测试面试必问点与经典笔试题汇总
  6. 单词APP的工作历程复盘
  7. 详解JS中的原型与继承
  8. MATLAB查看连续小波的形态和中心频率
  9. 中国互联网经济10年巨献:是春秋也是战国
  10. Oracle数据泵备份慢,expdp备份缓慢问题分析