DASCTF 2024暑期挑战赛 RE
DASCTF 2024暑期挑战赛
DosSnake
使用ghidra看反汇编

发现有XOR操作
在ida里面看汇编跟一下

字符DASCTF地址往下6个存放的数据与DASCTF字符串进行异或
A=[0x3f,0x09,0x63,0x34,0x32,0x13,0x2a,0x2f,0x2a,0x37,0x3c,0x23,0x00,0x2e,0x20,0x10,0x3a,0x27,0x2f,0x24,0x3a,0x30,0x75,0x67,0x65,0x3c]
B=[ord(i) for i in "DASCTF"]
for i in range(26):
A[i]=A[i]^B[i%6]
print(chr(A[i]),end="")
#DASCTF{H0wfUnnytheDosSnakeis!!!}
Strangeprograme
可以通过硬件断点来获取HOOK函数
遍历IAT HOOKmemcmp函数

真实逻辑

KEY

#include <stdio.h>
#include <stdint.h>
//解密函数
void decrypt (uint32_t* v, uint32_t* k) {
uint32_t v0=v[0], v1=v[1], i;
uint32_t delta=0x61C88647;
uint32_t sum=-delta*0x10;
uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
for (i=0; i<0x10; i++) { /* basic cycle start */
sum += 0x61C88647;
v1 -= (k3 + (v0 >> 5)) ^ (sum + v0) ^ (k2 + v0 * 16);
v0 -= (k1 + (v1 >> 5)) ^ (sum + v1) ^ (k0 + v1 * 16);
} /* end cycle */
v[0]=v0; v[1]=v1;
}
int main() {
uint32_t key[]={ 0x12345678, 0x09101112, 0x13141516, 0x15161718 };
uint32_t enc[40]={0xBC2B4DF9, 0x6213DD13, 0x89FFFCC9, 0x0FC94F7D, 0x526D1D63, 0xE341FD50, 0x97287633, 0x6BF93638,
0x83143990, 0x1F2CE22C};
for (size_t i = 8; i >= 2; i-=2)
{
enc[i] ^= enc[0];
enc[i+1] ^= enc[1];
decrypt(enc,key);
}
decrypt(enc,key);
puts((char*)enc);
}
#DASCTF{I4TH0ok_I5S0ooFunny_Isnotit?????}
BabyAndroid
给了txt,里面有一些数据,全局搜yuanshen


动态加载dex,使用frida-dexdump

看到加密的逻辑

AES ECB解密
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Encrypto {
private static final String KEY = "DSACTF";
private static final String TAG = "Encrypto";
private static byte[] customHash(String str) {
int i;
byte[] keyBytes = new byte[16];
int[] temp = new int[16];
for (i = 0; i < str.length(); i++) {
char charAt = str.charAt(i);
for (int i2 = 0; i2 < 16; i2++) {
temp[i2] = ((temp[i2] * 31) + charAt) % 251;
}
}
for (i = 0; i < 16; i++) {
keyBytes[i] = (byte) (temp[i] % 256);
}
return keyBytes;
}
public static String encrypt(String str) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(customHash(KEY), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
return Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));
}
public static String decrypt(String encryptedStr) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(customHash(KEY), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decodedBytes = Base64.getDecoder().decode(encryptedStr);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes, "UTF-8");
}
public static void main(String[] args) {
try {
String encryptedText = "TwMkYUkg4bYsY0hL99ggYWnVjWyXQrWAdNmToB0eBXbS6wBzL6ktorjNWI9VOroTU4HgIUYyzGLpcHzd1zNGT+bFZZI7IoxJwpcgXfdwW1LSmiNSP+PuSUsqAzNclF1nJ07b4tYyLWg0zTypbzWsLhOIM+6uci3RFZLREUCALafi01M8mS+KMNxX1Pyn8mSP+KKKjQ5S5fasHRSn+L9qBFws0mWavpfI0QEiMgarxv0iGhYU8cfgonWyL70RvoXET5VUDP1vfYWIBLzzzaAqLC0OiMtUK3TTATSU7yijdgXm18OKMcGIke/NZIM6Sr5fL3t6psDOOkw2C/5uYrJVPn+D6U9KTL64bgREppDqMOvhvbhtuf/S3ASW/+rhtPMtoaD8FxDg0wWSLZA53fQfNA==";
String decryptedText = Encrypto.decrypt(encryptedText);
System.out.println("Decrypted Text: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//Decrypted Text: 458.853181,-18.325492,-18.251911,-2.097520,-21.198660,-22.304648,21.103162,-5.786284,-15.248906,15.329286,16.919499,-19.669045,30.928253,-37.588034,-16.593954,-5.505211,3.014744,6.553616,31.131491,16.472500,6.802400,-78.278577,15.280099,3.893073,56.493581,-34.576344,30.146729,4.445671,6.732204
输出是浮点数 调用了native层的sendInit函数

继续跟进解密函数


搜了一下是离散余弦变换
import numpy as np
from scipy.fftpack import dct, idct
A=[458.853181,-18.325492,-18.251911,-2.097520,-21.198660,-22.304648,21.103162,-5.786284,-15.248906,15.329286,16.919499,-19.669045,30.928253,-37.588034,-16.593954,-5.505211,3.014744,6.553616,31.131491,16.472500,6.802400,-78.278577,15.280099,3.893073,56.493581,-34.576344,30.146729,4.445671,6.732204]
#离散余弦变化逆变换
C = idct(A, norm='ortho')
print(C)
#chr输出 四舍五入
for i in range(len(C)):
C[i] = round(C[i])
print(''.join([chr(int(i)) for i in C]))
#DASCTF{Y0u_Ar3Re4lly_H@ck3r!}
DASCTF 2024暑期挑战赛 RE的更多相关文章
- [复现]DASCTF Sept X 浙江工业大学秋季挑战赛-PWN
hehepwn 一开始泄露stack地址,然后写入shellcode返回到shellcode执行 from pwn import * context.os = 'linux' context.log_ ...
- 2017~ROS暑期学校~分享
http://www.robotics.sei.ecnu.edu.cn/ROS2017/ ---- 往年暑期学校活动:2015年,2016年 报名开始时间7月2日晚10点:暑期学校报名,机器人挑战赛报 ...
- 【pwn】DASCTF Sept 九月赛
[pwn]DASCTF Sept 月赛 1.hehepwn 先查看保护,栈可执行,想到shellcode 这题需要注意shellcode的写法 拖入ida中分析 一直以为iso scanf不能栈溢出, ...
- 编程之美2014挑战赛 复赛 Codehunt平台试题答案
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- 2015腾讯暑期实习生 Web前端开发 面试经历
[2015腾讯暑期实习生 Web前端开发 面试经历] 好吧,首先声明,我被刷了,应该是跪在二面 微信查到的面试状态一直呈现复试中 .. 整整四天了.. 看来是没希望了 不过也是一次经历,记录一下还是可 ...
- ThoughtWorks西邮暑期特训营 -- JavaScript在线笔试题
ThoughtWorks 公司在西邮正式开办的只教女生前端开发的女子卓越实验室已经几个月过去了,这次计划于暑期在西邮内部开展面向所有性别所有专业的前端培训. 具体官方安排请戳:ThoughtWorks ...
- hihoCoder挑战赛23
hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...
- <路径算法>哈密顿路径变种问题(2016华为软件精英挑战赛初赛)
原创博客,转载请联系博主! 前言:几天前华为的这个软件精英(算法外包)挑战赛初赛刚刚落幕,其实这次是我第二次参加,只不过去年只入围到了64强(32强是复赛线),最后搞到了一个华为的一顶帽子(感谢交大l ...
- 记拿到鹅厂前端开发暑期实习offer的经历
#想起来时的路 在真正拿到腾讯实习offer之前,也是看过不少人的面经,心生向往.很早在入前端坑之前,我就想着大四的时候有机会要尝试去腾讯里实习. 大一入门语言就是C++,这让我很无奈,所以我很快的就 ...
- 阿里聚安全攻防挑战赛第三题Android PwnMe解题思路
阿里聚安全攻防挑战赛第三题Android PwnMe解题思路 大家在聚安全挑战赛正式赛第三题中,遇到android app 远程控制的题目.我们今天带你一探究竟,如何攻破这道题目. 一.题目 购物应用 ...
随机推荐
- win10 搭建 npm 环境
前言 最近,根据CSDN和博客园等文章的帮助下,搭建了一个npm的环境,现在将搭建过程记录下来,留作参考. 搭建过程 下载nodejs,我是使用的zip包安装的,安装包官网地址https://node ...
- Mybatis 总结ResultMap的复杂对象查询
association:映射的是一个POJO类,处理一对一的关联关系 collection:映射的一个集合列表,处理的是一对多的关联关系 模版 <!--column不做限制,可以为任意表的字段, ...
- nginx面试题及答案
什么是nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代 ...
- JDK9之后 Eureka依赖
<!--Eureka添加依赖开始--> <dependency> <groupId>javax.xml.bind</groupId> <artif ...
- 洛谷P1451
背景:复习 简单的dfs,也可以说是有点像连通块 #include<iostream> #include<utility> using namespace std; typed ...
- 基于表单登录的cookies登录
1.基于表单登录的cookies登录 In [ ]: import requests import matplotlib.pyplot as plt from http.cookiejar impor ...
- Java-Request对象是用来回去请求信息,得到页面的请求
1.Request 1.1 request对象和response对象的原理(了解) request对象和response对象是由服务器创建的,我们来使用他们即可 request对象是用来回去请求信息, ...
- clickhouse节点重做(节点替换)
测试验证环境: docker容器化部署的4节点2分片和2副本(centos7+clickhouse22.1.3) 172.17.0.6 clickhouse01172.17.0.7 clickhous ...
- 全网最适合入门的面向对象编程教程:03 类和对象的Python实现-为自定义类添加属性
摘要: 本文主要介绍了,当使用 Python 创建自定义类时,如何为其添加属性,包括为类和实例添加属性两种,以及如何获取自定义的属性等内容. 往期推荐: 学嵌入式的你,还不会面向对象??! 全网最适合 ...
- [oeasy]python0041_teletype历史_博多码_shift_capslock_字符数字切换_gear
teletypewriter 历史 回忆上次内容 上次见到了一个真的机械打字机 感受到了蒸汽朋克的时代背景 上上次区分了一些概念 terminal终端,电脑连线最终的端点 TeleTYpewriter ...