【BUUCTF逆向题】[2019红帽杯]easyRE

ops/2025/2/8 5:17:28/

前言:这题与前面不同。flag不在输入输出中,甚至不在main函数中,就是藏在一个隐秘的角落!

一.[2019红帽杯]easyRE

首先就是查到了upx壳然后在kali中脱壳,之后用IDA64打开静态分析
进入之后发现没有找到main函数,是start(这里我突然想到之前见过这种start开始的题,于是我找到了那一题打开的界面,和这题基本一样)按F5反编译
在这里插入图片描述
反编译后我发现,除了第一个参数的函数以外,其他函数除了名字不一样,里面的内容都是一样的,我去查了很多,得到的结论是:在C++语言中,main函数之前会有一个start的开始处理,会调用栈、堆等等预处理,反正这里理解其他函数都是预处理函数就行,有效函数就是第一个参数的函数,我们把它当做main函数
在这里插入图片描述
双击进入主函数:(当然这题也可以Shift+F12锁定主函数,但是原理该懂的还是要去搞明白)阅读程序
起始的这个空间申请就不再赘述,开头结尾可以对上验证
在这里插入图片描述
最后的“You found me!!!”肯定就是正确出口但是前面有个continue,先分析上面的代码吧,具体分析我写在图片中了,每一个参数的由来都解释的非常清楚,逆向学习7分靠猜,知道大概当然也能推理,但是我更倾向于练习的时候抽丝剥茧
在这里插入图片描述
这就可以推出v15也就是第一次输入
脚本:

python">v17[1] = 111
v17[2] = 100
v17[3] = 108
v17[4] = 62
v17[5] = 81
v17[6] = 110
v17[7] = 98
v17[8] = 40
v17[9] = 111
v17[10] = 99
v17[11] = 121
v17[12] = 127
v17[13] = 121
v17[14] = 46
v17[15] = 105
v17[16] = 127
v17[17] = 100
v17[18] = 96
v17[19] = 51
v17[20] = 119
v17[21] = 125
v17[22] = 119
v17[23] = 101
v17[24] = 107
v17[25] = 57
v17[26] = 123
v17[27] = 105
v17[28] = 121
v17[29] = 61
v17[30] = 126
v17[31] = 121
v17[32] = 76
v17[33] = 64
v17[34] = 69
v17[35] = 67
flag=""
for i in range(36):flag+=chr(v17[i]^i)
print(flag)

得到字符串

python">Info:The first four chars are `flag`

信息而已,说前4个字符是flag,不知道能干嘛,继续往下分析
就是再次对输入的v18进行base64加密处理10次处理后与已知明文验证,通过则输出正确
在这里插入图片描述
补充:这可以看出来是base64加密,密钥都给了
在这里插入图片描述
在这里插入图片描述
补充:双击off_6CC090发现是常量,再追踪发现就是base64加密后的字符串
在这里插入图片描述
在这里插入图片描述
接着解密10次得到一个网址

python">https://bbs.pediy.com/thread-254172.htm

点进去是说主动防御的,没找到flag线索啊
在这里插入图片描述
到这里,懵逼了
后来知道,在off_6CC090之下有一段发现了没用到的数据
在这里插入图片描述
追踪发现函数sub_400D35,具体程序逻辑如图(看不懂的先不用管,后面会讲是什么)
知道v1第1位字符和最后1个字符经过异或运算后分别为f和g
结合第一段程序可以知道4个字符就是flag那么就可以反推出v1即密钥,然后就可以由明文推出所有异或的字符即flag
在这里插入图片描述
上脚本:

python">enc = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
key = ""
flag = ""
en = "flag"
for i in range(4):key+=chr(enc[i]^ord(en[i]))
print(key)
for j in range(len(enc)):flag+=chr(enc[j]^ord(key[j%4]))
print(flag)

key为**&YA1**

flag为flag{Act1ve_Defen5e_Test}

补充:为什么flag藏在一个只能靠数据追踪的函数中不在main函数中?对最后的函数追踪一下,Ctrl+X键,发现在.fini_array段才调用此函数,.fini_array是正序正常退出后才执行的函数,用来清空栈等调用的资源,这也与前面的start对应上了一个在前一个在后,原来这里也能藏flag
在这里插入图片描述

总结:这题让我知道了flag不只会在main函数中,也了解到了start和最后fini的处理方式,这些开始和结束的段也可以作为出题的地方,在以后没有main 的题中也能更清晰的分析 。


http://www.ppmy.cn/ops/156649.html

相关文章

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出&#xf…

【大数据技术】词频统计样例(hadoop+mapreduce+yarn)

词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…

MySQL万能备份脚本

此脚本适用于 MySQL 各个生命周期的版本 #!/bin/bash # mybackup.sh# 备份保留天数,建议保留三天 days7 # 备份时间 time$(date %Y%m%d%H%M%S) # 备份保存路径 backup_dir/opt/backup # 备份工具 toolmysqldump # 端口 port"3306" # 是否采用 --all-data…

【4】阿里面试题整理

[1]. 介绍一下数据库死锁 数据库死锁是指两个或多个事务,由于互相请求对方持有的资源而造成的互相等待的状态,导致它们都无法继续执行。 死锁会导致事务阻塞,系统性能下降甚至应用崩溃。 比如:事务T1持有资源R1并等待R2&#x…

有关Android Studio的安装与配置并实现helloworld(有jdk的安装与配置)(保姆级教程)

目录 一.下载与配置JDK (一)到JDK官网下载 (二)有关JDK版本的选择 1.进入页面以后。往下拉,根据你的电脑系统来进行对应的版本进行选择: 2.选择完对应的版本后,要下载之前你需要首先接收协议…

MySQL和Redis的区别

MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 一、基本概述 MySQL&…

Python(Pandas)数据分析学习

1.Pandas基本构成 引入Pandas import pandas as pd 1.Series 行 对应Excel中的一行数据,一维数据 定义Series # 第一个参数是具体数据 # 第二个参数的对应的索引下标 # 第三个参数的行名称 data pd.Series([1,2,3,4,5], index[a,b,c,d,e], namedata) print(d…

硬件电路基础

目录 1. 电学基础 1.1 原子 1.2 电压 1.3 电流 1.电流方向: 正极->负极,正电荷定向移动方向为电流方向,与电子定向移动方向相反。 2.电荷(这里表示负电荷)运动方向: 与电流方向相反 1.4 测电压的时候 2. 地线…