CTFShow的RE题(四)

news2024/11/13 10:55:24

真的是签到

在这里插入图片描述
给的是无后缀的 zip 文件,解压发现需要密码,也没有提示,猜测可能是 zip 伪加密 (走错厂了吧)
zip是否加密
首先就是看开头的6 ,7byte,和中间 01 02 后的 5 ,6byte
成功解压缩,继续做
信息
发现是 Aspack 壳,只能手动脱壳了。
就是使用 ESP 定理,就是最后在哪 dump 后面还需要再学学
在这里插入图片描述
这个说是在 push 后的 retn 执行后 dump
在这里插入图片描述

这是因为前面的壳压缩或加密导致odbg没有及时的去分析,此时我们需要右键分析选择分析代码
在这里插入图片描述
然后在这脱壳
ida打开好像还是不对,继续查看
在这里插入图片描述
可能还有一个魔改 UPX壳!
在这里插入图片描述
不会 upx 夹杂 aspack 吧 0——0,先试试
下面深红区应该还有一个 vmp 没找到,估计也只能手动再脱了
再 ESP 定律脱一下,再 push , jmp 大跳转后 dump
得到源程序
在这里插入图片描述

a = [0x6c,0x2f,0x30,0x31,0x32,0x33,0xb6,0xbf,0xa0,0xcf,0x7c,0x71,0x6a,0x6c,0x70,0x64,0x75,0x63][::-1]
print(bytes([i^v for i,v in enumerate(a)]).decode('gb2312'))
#ctfshow{签到?????}

或者

#include <stdio.h>
int main()
{
	int res[18] = { 0x6c,0x2f,0x30,0x31,0x32,0x33,0xffffffb6,0xffffffbf,0xffffffa0,0xffffffcf,0x7c,0x71,0x6a,0x6c,0x70,0x64,0x75,0x63 };
	for (int i = 17; i >= 0; i--)
	{
		res[i] = res[i] ^ (17 - i);
		printf("%c", res[i]);
	}
	printf("\n");
	return 0;
}

总结:zip伪加密,upx,aspack脱壳,还有就是中文字符打印即注意字符串比较顺序

批量生产的伪劣产品

一个 apk 文件
在这里插入图片描述
点击没有回显,仍 jadx 分析一下
太多包了,找不到 MainActivity ,搜索 flag 也没有什么信息
嗯,想不到了
在这里插入图片描述
往里面翻翻
在这里插入图片描述
感觉有点草率

总结

android题,找不到 MainActivity 可以先去 xml 文件看看,有入口点,是否可调试啊之类的,一些 Android 基础知识还是要去学学

来一个派森

python 打包的 exe 文件,解包得到 py 文件

def b58encode(tmp: str) -> str:
    tmp = list(map(ord, tmp))
    temp = tmp[0]
    base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
    for i in range(len(tmp) - 1):
        temp = temp * 256 + tmp[i + 1]

    tmp = []
    while 1:
        tmp.insert(0, temp % 58)
        temp = temp // 58
        if temp == 0:
            break

    temp = ""
    for i in tmp:
        temp += base58[i]

    tmp = []
    for i in range(len(temp)):
        tmp.append(chr(ord(temp[i]) ^ i))

    check = [
     'A', '5', 'q', 'O', 'g', 'q', 'd', '\x7f', '[', '\x7f', 's', 
     '{', 'G', 'A', 'x', '`', 'D', '@', 'K', 'c', '-', 'c', ' ', 
     'G', '+', '+', '|', 'x', '}', 'J', 'h', '\\', 'l']
    if tmp == check:
        return 1
    else:
        return 0


flag = input("输入flag:")
if b58encode(flag):
    print("you win")
else:
    print("try again")

base58 解了一下发现不对
唉,没注意到,前面 base58 后,还有一个异或
先异或回去,再解 base 58

学习

temp = tmp[0]
for i in range(len(tmp) - 1):
temp = temp * 256 + tmp[i + 1]

将 ASCII 码值列表 tmp 转换为一个大整数 temp,这种操作通常用于将字符串转换为一个数值以便进行进一步的数学运算或加密操作

tmp.insert(0, temp % 58)

tmp 是一个列表,将 temp%58 插入 tmp 的开头
是因为 Base58 编码是从右到左进行的,所以每次得到的余数都应该从列表的开头插入,以便最终生成正确的 Base58 编码字符串

好好学习 天天向上

在这里插入图片描述
看上去简单,但真不太好逆
在这里插入图片描述
应该是要用到爆破吧
v4,v2是关键,但真不知道怎么建立联系
所以每一次累加没有规律,只能爆破
找到一个 pwntools 脚本

from pwn import *
tab = 'abdefglostuyp{}_'
aa = open("D:\ctf附件2\cStuday.exe", 'rb').read()[0x2400: 0x13400]
def deeptry(i, v4, s):
    if v4 < 0:
        return False
    if i == 0:
        # print(i,hex(v4),s)
        if v4 == 0:
            print('-->' + s)
        return False
    for j in range(16):
        v2 = 17 * (j + 16 * i)
        p = 8 * (tab.index(s[0]) + v2)
        # print(hex(p))
        tmp = v4 - u64(aa[p:p + 8])
        deeptry(i - 1, tmp, tab[j] + s)
s = '}'
deeptry(31, 0x1C836D8E5C11047F, s)

但是确实数有点多,跑出来应该也要半天
翻翻wp,都是猜出来的
在这里插入图片描述
就难评

不过也再次说明逆向确实很需要猜 0_0

屏幕裂开了

你的手机屏幕能承受住那么多次点击吗?
在这里插入图片描述
所以 flag 肯定藏在哪里,找到点击那个函数,修改一下判断条件再调试,这应该是最优解,或者直接找到 flag
在这里插入图片描述
jeb试试
在这里插入图片描述
表示 v4<v5,就跳转到 BE 标签
可以修改 v4,v5 顺序,也可以改成指令 if-le
然后忘记怎么修改 jeb 指令了,0_0
在这里插入图片描述

鼠标点击要下断点的行:ctrl+b 打断点鼠标点击要下断点的行:control+b 打断点

不知道为什么 NP 里的 MainActivity 里面没有那个判断

在这里插入图片描述
后面还有一个 Main 类里面找到了,
还有可以通过Android Killer 实现,上述想法,不过还是有一点问题,看看课再说吧
网上看了一下,wp都是直接逆的算法
怎么都不想偷懒吗?唉,都这么勤快
在这里插入图片描述
在这里插入图片描述
应该就是 RC4,但解出来不对
在这里插入图片描述
所以最后异或那部分要重复 99999 次,不对不是异或那,是S盒打乱那
贴个学习大佬的脚本

s = [i for i in range(256)]
k = (b"InfinityLoop"*22) [0:256]
 
for hit_count in range(99999):
    j = 0
    for i in range(256):
        j = (s[i]+j+k[i])%256
        s[i],s[j] = s[j],s[i]
 
answer = [0xA6,0x3D,0x54,0x0B0,0x74,0xCC,0xBD,0x2A,0x4A,0x0DE,0x0BD,0x35,0x0D1,0x1D,0x80,0x32,0x5F,0x64,0x2F,0x0C5,0x0DD,0x11,0x3E,0x95,0x0CC,0x17,0x13,0x0E5,0x5E,0x65,0x0CE,0x42,0x9E,0x47,0x0C8,0x0F3,0x4D,0x8A,0x0A6,0x1F,0x0F0,0x50,0x27,0x0A2,0x28,0x81,0x24,0x0A7,0x0B4,0x90,0x0FC,0x93,0x8A,0x0C1,0x77,0x0D5,0x16,0x1E,0x0FD,0x87,0x0C7,0x0BB,0x0B3,0x0]
 
v10,v11 = 0,0
v14 = s 
tab = [0]*63
for j in range(63):
    v11 = v11+1
    v10 = (v14[v11] + v10)& 0xff
    v14[v11],v14[v10] = v14[v10],v14[v11]
    tab[j] = v14[(v14[v10]+ v14[v11]) %256]
 
flag = [answer[i]^tab[i] for i in range(63)]
print(bytes(flag))
#flag{i_hope_you_didnt_click_the_button_99999__justRE_in_Static}
i=0
j=0
key='InfinityLoop'
flag='\xa6\x3d\x54\xb0\x74\xcc\xbd\x2a\x4a\xde\xbd\x35\xd1\x1d\x80\x32\x5f\x64\x2f\xc5\xdd\x11\x3e\x95\xcc\x17\x13\xe5\x5e\x65\xce\x42\x9e\x47\xc8\xf3\x4d\x8a\xa6\x1f\xf0\x50\x27\xa2\x28\x81\x24\xa7\xb4\x90\xfc\x93\x8a\xc1\x77\xd5\x16\x1e\xfd\x87\xc7\xbb\xb3'
s=[]
k=[]
for i in range(256):
    s.append(i)
    k.append(0)

for i in range(256):
    k[i]=ord(key[i%len(key)])

for t in range(99999):
    j=0
    for i in range(256):
        j=(j+s[i]+k[i])%256
        tmp=s[i]
        s[i]=s[j]
        s[j]=tmp

for a in range(16):
    for b in range(16):
        print('%.2x '%s[16*a+b],end='')
    print()
i=0
j=0

for k in range(len(flag)):
    i=(i+1)%256
    j=(j+s[i])%256
    tmp=s[i]
    s[i]=s[j]
    s[j]=tmp
    t=(s[i]+s[j])%256
    print(chr(ord(flag[k])^s[t]),end='')

这是我能写的 0_0

for a in range(16):
for b in range(16):
print(‘%.2x ’ % s[16*a + b], end=’')
print()

%.2x 是一个格式化字符串,表示输出一个十六进制数,且占两位,不足两位时在前面补0

二进制玩家人均全栈

又是一个 zip 伪加密,这次有两个 50 4B 01 02
在这里插入图片描述
第一个没有问题,改第二个
在这里插入图片描述
不知道是个什么,丢 010 看看
在这里插入图片描述
多了一个 7F ,删掉试试
在这里插入图片描述
好像不是 exe ,ida 打开也不是
在这里插入图片描述
发现和 elf 文件头也很像,试试
在这里插入图片描述
对了,但应该有个壳,没查出来
在这里插入图片描述
下一个 die 查一下,说是两个互补用
在这里插入图片描述
查到了,但还是待去 010 看看
在这里插入图片描述
都改一下吧
exe 只有三个
在这里插入图片描述
不知道有些师傅都怎么改的
第一处是特征值 : UPX!
在这里插入图片描述
只能先留这了,之后遇到再看看
刚好下面一个是加UPX的64位elf
在这里插入图片描述
最后两个也是 UPX!
成功了,elf的UPX壳是有 ==三个特征值 UPX!==分别在开头和结尾两个。
先手动脱一下

ida来dump得到elf文件
调半天,卡在这了
在这里插入图片描述
好烦 0_0
找找资料,学学先。

一眼maze题
在这里插入图片描述
len(map)=256=488
难道是分四个小地图还是一个三维(只有四个方向键应该不是)
在这里插入图片描述
我是就这直接提取的,看了一下 wp:大家是按 dword 提取的 0_0
在这里插入图片描述
成功了,把 create as array 取消就行了
但是 shift+e 提取的还是 256 个,不知道为什么,问问其他师傅
在这里插入图片描述
这样得到地图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做一个透明度渐现且向上位移逐行出现的文字效果

前言 在这个夜黑风高的夜晚&#xff0c;你的眼睛已经开始有些疲惫。你的手指在键盘上轻轻地敲击着&#xff0c;仿佛在弹奏一首无声的夜曲。你的思绪在代码的海洋中飘荡&#xff0c;寻找着最后一行需要完成的代码。就在这时&#xff0c;你的老板走了过来&#xff0c;他的脸上带…

简过网:事业单位编制有哪几种类型,你都知道吗?

近几年来&#xff0c;随着考编、考公热&#xff0c;越来越多的朋友都有考编的想法&#xff0c;尤其是刚毕业的大学生&#xff0c;但是很多朋友对于事业单位编制有不清楚的地方&#xff0c;比如到底哪些属于事业单位的范围&#xff0c;事业单位编制分为哪些类型&#xff1f;今天…

解决:Android Studio 突然打不开!提示Failed to create JVM:error code -1

Android studio1.5 一直用得好好的&#xff0c;突然有一天打不开&#xff0c;并提示&#xff1a; 可是系统配置中&#xff0c;java的配置也是正常的。 解决方法&#xff1a; 修改安装目录下的studio64.exe.vmoptions 文件 直接将文件内容改成&#xff1a; -Xms128m -Xmx512m…

【活动行】参与上海两场线下活动,教育生态行业赛总决赛活动和WAIC人工智能大会活动 - 上海活动总结

目录 背景决赛最后一公里领域范围 决赛作品AI智教相机辅导老师Copilot辅导老师Copilot雅思写作竞技场 优秀作品总结 背景 决赛 百度发起的千帆杯教育生态行业赛于2024年7月4日进行线下决赛&#xff0c;博主虽然没能进入决赛&#xff0c;但也非常荣幸能够以嘉宾身份到现场给进…

213.贪心算法:跳跃游戏||(力扣)

class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0; // 如果数组长度为1&#xff0c;已经在终点&#xff0c;不需要跳跃int cur 0; // 当前跳跃能到达的最远位置int flag 0; // 记录跳跃次数int next 0; // 下一次跳跃能到…

软件设计之Java入门视频(13)

软件设计之Java入门视频(13) 视频教程来自B站尚硅谷&#xff1a; 尚硅谷Java入门视频教程&#xff0c;宋红康java基础视频 相关文件资料&#xff08;百度网盘&#xff09; 提取密码&#xff1a;8op3 idea 下载可以关注 软件管家 公众号 学习内容&#xff1a; 该视频共分为1-7…

2024年【低压电工】考试题库及低压电工考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年低压电工考试题库为正在备考低压电工操作证的学员准备的理论考试专题&#xff0c;每个月更新的低压电工考试总结祝您顺利通过低压电工考试。 1、【单选题】PE线或PEN线上除工作接地外其他接地点的再次接地称为(…

通过Vxlan实现数据中心互联有感

随着企业的发展&#xff0c;为满足跨地域运营、用户接入、异地灾备等场景&#xff0c;越来越多的企业通常在多地域部署多个数据中心。 数据中心互联DCl(Data Center Interconnection)是不同数据中心VM之间互相通信的一种解决方案使用VXLAN、BGP EVPN等技术&#xff0c;使数据中…

RoPE 旋转位置编码,详细解释(下)NLP 面试的女生彻底说明白了

RoPE 旋转位置编码&#xff0c;详细解释&#xff08;下&#xff09;NLP 面试的女生彻底说明白了 原创 看图学 看图学 2024年07月01日 07:55 北京 书接上文&#xff0c;上文见&#xff1a;这么解释 RoPE 旋转位置编码&#xff0c;女朋友睁大了双眼&#xff08;上&#xff09; …

12种增强Python代码的函数式编程技术

前言 什么是函数式编程&#xff1f; 一句话总结&#xff1a;函数式编程(functional programming)是一种编程范式&#xff0c;之外还有面向对象&#xff08;OOP&#xff09;、面向过程、逻辑式编程等。 函数式编程是一种高度抽象的编程范式&#xff0c;它倡导使用纯函数&#x…

【计算机网络】物理层(作业)

1、若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB 条件下的极限数据传输速率&#xff0c;则信号状态数至少是&#xff08;D&#xff09;。 A. 4B. 16C. 8D. 32 解析&#xff1a;可用奈奎斯特采样定理计算无噪声情况下的极限数据传输速率&#xff0c;用香农第二定…

Aqara 发布多款智能照明新品,引领空间智能新时代

7月8日&#xff0c;全球 IoT 独角兽品牌 Aqara 以“光&#xff0c;重塑空间想象”为主题&#xff0c;举办了线上智能照明新品沟通会。 会上&#xff0c;Aqara 正式发布一系列引领行业的智能照明新品&#xff0c;包括银河系列轨道灯 V1 以及繁星系列妙控旋钮 V1 等&#xff0c;…

Leetcode—97. 交错字符串【中等】

2024每日刷题&#xff08;140&#xff09; Leetcode—97. 交错字符串 2d动规实现代码 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int m s1.length();int n s2.length();int len s3.length();if(m n ! len) {return false;}vector<…

metersphere链接腾讯邮箱步骤

1、打开腾讯邮箱生成授权码 路径&#xff1a;设置-账户-账户安全 生成的授权码只会展示1次&#xff0c;注意保存 2、在系统设置-系统参数设置-邮件设置填写授权码和SMTP信息 SMTP信息在邮箱的客户端设置中可以获取到对应的信息 3、信息填写完后&#xff0c;可以测试连接&…

XDMA原理学习(1)——DMA技术详解

目录 一、什么是DMA&#xff1f;为什么需要DMA&#xff1f; 二、DMA分类 2.1 Block DMA 2.2 Scatter-Gather DMA 2.3 Ring buffer DMA 三、实际案例 3.1 STM32微处理器 3.1.1 Block DMA 3.1.2 Scatter-Gather DMA 3.1.3 使用场景举例&#xff1a; 3.1.4 配置与实现 …

Vue框架引入

vue简介 1.1.vue是什么?Vue官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ vue是一套构建用户界面的渐进式javascript框架 构建用户界面:将我们手里拿到的数据通过某种办法变成用户可以看见的界面前端工程师的职责:就是在合适的时候发出合适的请求,然后…

PyQt5显示QImage并将QImage转换为PIL图像保存到缓存

PyQt5显示QImage并将QImage转换为PIL图像保存到缓存 1、效果图 2、流程 1、获取摄像头资源,打开摄像头 2、截取图像 3、opencv读的通道是BGR,要转成RGB 4、往显示视频的Label里显示QImage 5、将QImage转换为PIL图像,并保存到缓存 6、获取图像中人脸信息3、代码 # -*- codin…

数据结构(Java):链表面试OJ题

1、题一&#xff1a;获取链表倒数第k个节点 . - 力扣&#xff08;LeetCode&#xff09; 1.1 思路解析 此题我们使用双指针法求解。 首先&#xff0c;我们要知道&#xff0c;倒数的第k个节点&#xff0c;距离倒数第一个节点还需要移动k-1次。 1.那么我们可以定义出两个指针&…

VS2019运行显示缺少调试目标

出现问题点 如果点击运行显示上述错误&#xff0c;可以尝试先清理&#xff0c;然后重新生成 此时会出来一个调试目标路径&#xff0c;代表生成成功 但是运行还是显示缺少调试目标 右键项目&#xff0c;点击属性&#xff0c;然后修改路径&#xff0c;既可成功

最小爬楼梯(dp)

import java.util.Scanner;public class ClimbingStairsCost {public static int minCostClimbingStairs(int[] cost) {int n cost.length; // 获取输入的 cost 数组的长度int[] dp new int[n 1]; // 创建一个用于存储每个台阶最小花费的 dp 数组dp[0] 0; dp[1] 0; // 初始…