我们这题被锤了,理由是与摘星实验室wp重合度高

重合度有多高我不知道,但是我们所有人都压根没听说过这个实验室

所以在这里放一个更加细致的wp,不想让几十个小时的努力付之东流。

文件打开了,函数很多,有3800个

先查字符串,对照着程序的运行结果

找到main函数

在这里,IDA 7.0无法很好的解释该程序,导致F5得到结果看起来正确但实际并不完整。

而IDA 7.6则会显著的标出错误部分,方便汇编代码上的审查

这是IDA7.6最初分析出来的main函数

看一下汇编代码,发现其中有很多字节码的混淆

这些才是导致IDA误判函数内容的原因

手动修复一下

得到main函数

void __usercall sub_4A2980(__int64 a1@<rbx>, __int64 a2@<rbp>, __int64 a3@<rdi>, __int64 a4@<rsi>, __int64 a5@<r12>, __int64 a6@<r13>, __int64 a7@<r14>, __int64 a8@<r15>)
{char *v8; // r15char *v9; // rdiint *v10; // r12char *v11; // r14char *v12; // rbxchar *v13; // r13int v14; // eaxsigned __int64 v15; // raxint v16; // edxint v17; // eaxsigned __int64 v18; // raxint v19; // edxint v20; // ecxint v21; // eax__int64 v22; // raxchar v23; // dlchar v24; // [rsp+30h] [rbp-3F8h]__int64 v25; // [rsp+70h] [rbp-3B8h]char v26; // [rsp+80h] [rbp-3A8h]__int64 v27; // [rsp+C8h] [rbp-360h]__int64 v28; // [rsp+110h] [rbp-318h]__int64 v29; // [rsp+158h] [rbp-2D0h]char v30; // [rsp+1A0h] [rbp-288h]int v31; // [rsp+1C4h] [rbp-264h]__int64 v32; // [rsp+1E8h] [rbp-240h]int v33; // [rsp+20Ch] [rbp-21Ch]char v34; // [rsp+2C0h] [rbp-168h]char v35[8]; // [rsp+3E0h] [rbp-48h]sub_40CC40();memset(&v24, 0, 0x50ui64);sub_49F840(&unk_4A68E0, "Input Your Key:");sub_4A04A0(&unk_4A6580, &v24);if ( strlen(&v24) == 64 ){if ( __OFADD__(1, 2004318072) ){if ( !__OFADD__(1, 2004318072) )JUMPOUT(*(_QWORD *)&byte_4A2A4F);}v8 = &v24;v9 = &v34;v10 = (int *)&unk_4A4020;v11 = &v34;sub_49F840(&unk_4A68E0, "Are You Sure You Want To Keep Waiting...\n");v12 = &v26;v13 = &v26;do{v14 = sub_401DB0(v8, 8i64);v12[8] = 0;*((_DWORD *)v12 + 1) = v14;v15 = 4i64;while ( 1 ){v16 = v15;if ( v12[v15 + 3] )break;if ( !--v15 ){v16 = 0;break;}}*(_DWORD *)v12 = v16;v17 = *v10;v11[8] = 0;*((_DWORD *)v11 + 1) = v17;v18 = 4i64;while ( 1 ){v19 = v18;if ( v11[v18 + 3] )break;if ( !--v18 ){v19 = 0;break;}}v8 += 8;*(_DWORD *)v11 = v19;v12 += 36;v11 += 36;++v10;}while ( v8 != (char *)&v25 );sub_403460(&v30, 13i64);sub_403460(&v31, 14i64);sub_403460(&v32, 15i64);sub_403460(&v33, 16i64);sub_4029E0(&v26, &v30);sub_4029E0(&v27, &v30);sub_402030(&v28, &v30);sub_402030(&v29, &v30);v20 = 0;while ( 1 ){v21 = *(_DWORD *)v13;if ( *(_DWORD *)v13 != *(_DWORD *)v9 )break;if ( v21 - 1 >= 0 ){if ( v35[36 * v20 - 861 + v21] != v35[36 * v20 - 285 + v21] )break;v22 = v21 - 2;while ( (signed int)v22 >= 0 ){v23 = v13[v22-- + 4];if ( v23 != v9[v22 + 5] )goto LABEL_2;}}++v20;v13 += 36;v9 += 36;if ( v20 == 8 ){sub_401550("QWB{%s}\n");return;}}}
LABEL_2:sub_401550("sorry\n");
}

第一关做了一个小判断,在修复函数前是很难看出来什么意思的

但也可以用x64dbg进行动态调试,勉强能够猜出是判断字符串的长度是不是等于0x40

之后遇到一个很费时的一个函数401EF0

进去之后基本看不懂,但是输入是写死的,只需要把每一个返回值找到就行了

记录下这些返回值,就是产生的key

key = [0xfffd,0x1fffd,0x3fffd,0x7fffd]

在下面的函数中被用到

随后来到函数sub_403460

看到这里(v16>>11) & 3

基本上就能猜出来是XTEA加密了

同时delta是0xE6EF3D20 sum是0x70C88617

其中的运算符全部用函数来代替了

接着再看sub_402030

里面又出现了401EF0函数,用来产生一个值

再往下看又遇见了xor函数

即把密文与401EF0产生的值进行异或操作

这四个函数都是相同的操作

依次找出所有的异或值

0xfd,0x1fd,0x3fd,0x7fd

然后就是进行字符串的比对了

由此写出脚本

def TEAdecode(c, key):tmp_0 = c[0]tmp_1 = c[1]sum = 0xa6a53780delta = 0x3d3529bcfor i in range(32):tmp_1 -= ((tmp_0<<4) + key[2]) ^ (tmp_0 + sum) ^ ((tmp_0>>5) + key[3])tmp_1 &= 0xfffffffftmp_0 -= ((tmp_1<<4) + key[0]) ^ (tmp_1 + sum) ^ ((tmp_1>>5) + key[1])tmp_0 &= 0xffffffffsum -= deltareturn (tmp_0, tmp_1)def XTEAdecode(circle, c, key):tmp_0 = c[0]tmp_1 = c[1]delta = 0x70C88617sum = 0xE6EF3D20for i in range(circle):    tmp_1 -= (((tmp_0 << 4) ^ (tmp_0 >> 5)) + tmp_0) ^ (sum + key[(sum>>11) & 3])tmp_1 &= 0xffffffff        sum += delta;  tmp_0 -= (((tmp_1 << 4) ^ (tmp_1 >> 5)) + tmp_1) ^ (sum + key[sum & 3])tmp_0 &= 0xffffffffreturn (tmp_0, tmp_1)c = [0x1F306772, 0xB75B0C29, 0x4A7CDBE3, 0x2877BDDF, 0x1354C485, 0x357C3C3A, 0x738AF06C, 0x89B7F537]
key = [0xfffd,0x1fffd,0x3fffd,0x7fffd]for i in range(0, 4, 2):c[i] ^= 0xfdc[i+1] ^= 0x1fd
for i in range(4, 8, 2):c[i] ^= 0x3fdc[i+1] ^= 0x7fdflag = ''
for i in range(0, 4, 2):ans = XTEAdecode(32, c[i:], key)flag += hex(ans[0])[2:] + hex(ans[1])[2:]
for i in range(4, 8, 2):ans = TEAdecode(c[i:], key)flag += hex(ans[0])[2:] + hex(ans[1])[2:]
print("QWB{"+flag.upper()+"}")

不知道是不是因为xtea和tea解密脚本相似度高的原因

但是如果是因为这个而ban掉参赛队伍,未免不太负责.毕竟解密脚本全网统一,我也是从网上找的代码....

2021强网杯 LongTimeAgo相关推荐

  1. 强强联手:2021强网杯LongTimeAgo复盘分析

    花指令 查看main函数能看出有异常跳转. 查看汇编,将此处c为代码. 之后再依次去除花指令,再反汇编得到main函数伪代码. 主函数不短,先根据参数大概还原函数名,可以看出是常规的对输入加密再che ...

  2. 2021强网杯 ezmath writeup

    前言 题目ida查看后发现是浮点数的运算,涉及到精度的问题,本来想的是爆破每一位,但是发现条件由于精度损失的问题不可能相等,且数据越来越大,直到程序inf.后来听说是math有关的知识,看了别人的wp ...

  3. 2021 强网杯 pwn notebook

    kernal pwn 给了几个文件,然后来看看启动文件 #!/bin/sh stty intr ^] exec timeout 300 qemu-system-x86_64 -m 64M -kerne ...

  4. 2021强网杯 Web赌徒 WP

    文章目录 源代码: 分析 __invoke __get _tostring EXP 调用流程: 总结 源代码: <meta charset="utf-8"> <? ...

  5. 强网杯2021 ctf线上赛ezmath wp(#超详细,带逆向新手走过一个又一个小坑)

    文章目录 引言 一.分析文件类型 二.初步分析 1 运行情况 2 IDA初步分析 三.详细分析 1 sub_13F3函数分析 2 查找蛛丝马迹 (1)mprotect (2)重写unk_2010 3 ...

  6. 2021第五届强网杯部分writewp

    第五届强网杯部分题解 web-最后两道是师弟做得 pwn-by-RGDZ 菜鸡简单记录一下本次比赛.持续更新 文章目录 第五届强网杯部分题解 前言 一.Web 1.1Web1 [强网先锋]寻宝 操作过 ...

  7. [强网杯2021]XBUUCTF[QWB2021 Quals]popmaster复现记录

    给自动化代码审计的大佬跪了. 出题人写的WP在这里:强网杯[pop_master]与[陀那多]赛题的出题记录 复现可以到BUUCTF,启动[QWB2021 Quals]popmaster这道题就ok. ...

  8. 强网杯2021 misc 复现

    对强网杯BlueTeaming.ISO1995.CipherMan.Threebody的复现 (纯萌新学步) 可以参考mumuzi大佬的wp https://blog.csdn.net/qq_4288 ...

  9. 第五届“强网杯”青少年专项赛盛大开赛

    9月25日,第五届"强网杯"青少年专项赛线上赛盛大开赛.作为国家级赛事强网杯的系列专项赛,青少年专项赛圆满践行了向青少年普及网络安全知识与技能,提升青少年网络安全素养和创新能力,发 ...

  10. php upload ctf,强网杯CTF防御赛ez_upload Writeup

    这是强网杯拟态防御线下赛遇到的web题目,本来是不打算分享Writeup的,但是由于问的人很多,于是这里分享给大家. ez_upload这题算是非常经典的堆叠black trick的题目,算是比较典型 ...

最新文章

  1. spring中的ReflectionUtil
  2. linux下mq的mc.sh在哪?,RocketMQ的安装与使用
  3. Codeforces 685C Optimal Point (二分、不同类型距离的相互转换)
  4. GridView 序号 排序 正序 倒序
  5. 面试题之Java内存区域
  6. android 多个style,Android样式的开发_style篇
  7. python基础代码大全-Python网络爬虫实战项目代码大全(长期更新,欢迎补充)
  8. 信息论和贝叶斯(或许会继续补充)
  9. iOS在应用中添加自定义字体
  10. 这才是程序员该有的桌面壁纸!
  11. 文件服务器和ftp服务器的区别
  12. Kubernetes 深入理解 Pod
  13. .img文件怎么打开(解压缩)
  14. c语言计算输入20个有符号整数,统计正整数,零,负整数的个数.操作,输入20个有符号整数,统计正整数.零.负整数的个数.并分别计算之和...
  15. fiddler抓包 - Android 虚拟机
  16. 宏转录组方法_Cell:基因表达的改变和群落的更替塑造了全球海洋宏转录组
  17. 五分频器(Verilog)
  18. Unity吃豆人敌人BFS广度(宽度)优先算法实现怪物追踪玩家寻路
  19. 如何将协议规范变成开源库系列之 WebSocket (一)
  20. 什么是数据恢复?数据丢失的最常见原因有哪些?

热门文章

  1. PL/SQL Developer 9.0.1.1613+注册机
  2. c语言编程实现红绿灯,C语言实现红绿灯.doc
  3. 16s扩增子 qiime2 实战
  4. 计算机主机不启动的故障,电脑不能正常启动的原因及解决方法
  5. java 实现图片转化为PDF
  6. 微软服务器系统版本有几个,windows系统有几个版本
  7. 实用插件(七)视频播放插件——ckplayer
  8. 计算机断层扫描法原理,能谱计算机断层扫描成像的概念和基本原理.PDF
  9. STM32控制0.96寸OLED(4针/4Pin)汉字以及数字,英文显示
  10. 如何实现chrome谷歌浏览器多开(独立环境 独立cookie)