ISCTF2023 Reverse方向 WP

文章目录

  • Reverse
    • crackme
    • EasyRe
    • babyRe
    • easy_z3
    • FloweyRSA
    • easy_flower_tea
    • mfx_re
    • z3_revenge
    • WHERE

Reverse

crackme

image-20231128235807877

加了UPX壳,可以看到EP Section处UPX标识被修改了

用WinHex修改

image-20231128235912601

之后UPX脱壳

image-20231128235954127

image-20231129000032590

得到flag。


EasyRe

image-20231129000118429

image-20231129002417390

逆向一下,先逆序,再做一些字符的替换,最后异或0x11.

for ( i = v6 - 1; i >= 0; --i )
    v4[v6 - i + 111] = v4[i + 112];

这一部分,实际上就是将数组 v4 中的元素从索引 iv6 - 1 复制到数组 v4 中的索引 v6 - i + 111v6 + 110 的位置

EXP:

enc = ']P_ISRF^PCY[I_YWERYC'
trans_table = str.maketrans('YC', 'BX')
result = enc.translate(trans_table)
re_result = result[::-1]
flag = ''.join([chr(ord(char) ^ 0x11) for char in re_result])

print(flag)
# ISCTFSNXJSIAOWCBXNAL

babyRe

image-20231209082308108

py逆向。用pyinstxtractor解包。

image-20231209082421065

之后找到babyRe.pyc和struct.pyc 拖进WinHex中比较magic number

image-20231209082519282

image-20231209082548264

相同,没有魔改。则直接对babyRe进行反编译,使用uncompyle6 或者 pyc在线反编译

image-20231209082653959

发现是个rsa加密,结合output;已知(p+1)*(q+1)和(p+q);那么根据简单的数学公式,我们可以知道phi 即 (p-1)(q-1) = (p+1)(q+1) - 2(p+q),以及n = p * q = (p+1)(q+1) - (p+q) - 1;

之后根据RSA的计算公式可以解出flag

EXP:

from Crypto.Util.number import long_to_bytes
from gmpy2 import invert

paddq=292884018782106151080211087047278002613718113661882871562870811030932129300110050822187903340426820507419488984883216665816506575312384940488196435920320779296487709207011656728480651848786849994095965852212548311864730225380390740637527033103610408592664948012814290769567441038868614508362013860087396409860
p1xq1=21292789073160227295768319780997976991300923684414991432030077313041762314144710093780468352616448047534339208324518089727210764843655182515955359309813600286949887218916518346391288151954579692912105787780604137276300957046899460796651855983154616583709095921532639371311099659697834887064510351319531902433355833604752638757132129136704458119767279776712516825379722837005380965686817229771252693736534397063201880826010273930761767650438638395019411119979149337260776965247144705915951674697425506236801595477159432369862377378306461809669885764689526096087635635247658396780671976617716801660025870405374520076160
c=5203005542361323780340103662023144468501161788183930759975924790394097999367062944602228590598053194005601497154183700604614648980958953643596732510635460233363517206803267054976506058495592964781868943617992245808463957957161100800155936109928340808755112091651619258385206684038063600864669934451439637410568700470057362554045334836098013308228518175901113235436257998397401389511926288739759268080251377782356779624616546966237213737535252748926042086203600860251557074440685879354169866206490962331203234019516485700964227924668452181975961352914304357731769081382406940750260817547299552705287482926593175925396
n = p1xq1 - paddq - 1
phi = p1xq1 - 2*paddq
e = 65537
d = invert(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))

# ISCTF{kisl-iopa-qdnc-tbfs-ualv}

easy_z3

py文件打开,发现就是一堆约束条件,用python的z3约束求解。

image-20231209162340796

根据源代码,还需要将计算出的整数转换为ascii码的形式。

EXP:

from z3 import *

s = Solver()

l = [Int(f"l_{i}") for i in range(6)]

s.add((593*l[5] + 997*l[0] + 811*l[1] + 258*l[2] + 829*l[3] + 532*l[4]) == 0x54eb02012bed42c08)
s.add((605*l[4] + 686*l[5] + 328*l[0] + 602*l[1] + 695*l[2] + 576*l[3]) == 0x4f039a9f601affc3a)
s.add((373*l[3] + 512*l[4] + 449*l[5] + 756*l[0] + 448*l[1] + 580*l[2]) == 0x442b62c4ad653e7d9)
s.add((560*l[2] + 635*l[3] + 422*l[4] + 971*l[5] + 855*l[0] + 597*l[1]) == 0x588aabb6a4cb26838)
s.add((717*l[1] + 507*l[2] + 388*l[3] + 925*l[4] + 324*l[5] + 524*l[0]) == 0x48f8e42ac70c9af91)
s.add((312*l[0] + 368*l[1] + 884*l[2] + 518*l[3] + 495*l[4] + 414*l[5]) == 0x4656c19578a6b1170)


flag = ''
if s.check() == sat:

    model = s.model()
    for i in range(6):
        hex_model = hex(model[l[i]].as_long())[2:]
        flag += "".join(chr(int(hex_model[j:j+2],16))for j in range(0,len(hex_model),2))
    print(flag)
# ISCTF{N0_One_kn0ws_m@th_B3tter_Th@n_me!!!}

FloweyRSA

image-20231209090613829

ida打开之后全是爆红,找到花指令的地方。

image-20231209090717075

jz到label1中间的内容是混淆的东西,全部nop掉,

image-20231209090759097

之后在main函数处用P 创建函数,根据提示对相应地址的内容进行修复(nop掉再C转化代码)修完之后,回到main处 P 一下,之后反编译就可以了。

image-20231209090936754

得到:

image-20231209091039222

可以知道是一个RSA加密,密文数据在c中,e为 465,n很小,可以分解得到 p 和 q。

EXP:

from Crypto.Util.number import long_to_bytes
from gmpy2 import invert

enc = [0x753C2EC5, 0x8D90C736, 0x81282CB0, 0x7EECC470, 0x944E15D3, 0x2C7AC726, 0x717E8070, 0x30CBE439, 0x0B1D95A9C,
       0x6DB667BB, 0x1240463C, 0x77CBFE64, 0x11D8BE59]
e = 0x1D1
p = 56099
q = 56369
n = p * q
phi = (p - 1) * (q - 1)
d = invert(e, phi)
flag = b''
for key in enc:
    m = pow(key, d, n)
    flag += long_to_bytes(m)
print(flag)

# b'flag{reverse_is_N0T_@lways_jusT_RE_myy_H@bIb1!!!!!!}'

easy_flower_tea

image-20231209160252169

IDA打开后无法加载,地址爆红,看汇编

image-20231209160415934

image-20231209160459378

直接NOP掉,然后P了反编译就好。

image-20231209160534610

要求我们输入number 1 和number 2,对着俩个数进行加密之后进行验证。查看一下加密函数sub_41100A

image-20231209160631080

就是一个简单的TEA加密。

EXP:


#include <stdio.h>
#include <stdint.h>  // 使用uint32_t数据类型需要包含此头文件
#include <string.h>
 #include<iostream>
 using namespace std;
// 定义加密函数
// 定义加密函数
void tea_decrypt(uint32_t *v, uint32_t *k) {
    uint32_t v0 = v[0], v1 = v[1], i;  // 根据TEA算法,解密轮次的计算需要初始化sum
    uint32_t delta = 0x61C88647;
    uint32_t sum = -(delta*32);
 
    for (i = 0; i < 32; i++) {
        v1 -= ((v0 * 16) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]);
        v0 -= ((v1 * 16) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]);
        sum += delta;
    }
 
    v[0] = v0;
    v[1] = v1;
}
 
int main() {
    uint32_t enc[2]={1115126522,2014982346};
    uint32_t key[]={12,34,56,78};
    tea_decrypt(enc,key);
    cout<<enc[0]<<endl;
    cout<<enc[1];
    return 0;
}

mfx_re

UPX魔改壳,使用WinHex将MFX都改成UPX,mfx改成upx就好了。之后用UPX脱壳

image-20231209162759835

只有处–s[i],逆向一下就是 +1

EXP:

enc = 'HRBSEz51e1a81c,78b3,34d`,84`4,6acce2c776a0|'
print("".join(chr(ord(enc[i])+1)for i in range(len(enc))))
# ISCTF{62f2b92d-89c4-45ea-95a5-7bddf3d887b1}

z3_revenge

image-20231209163202351

image-20231209163235461

一样的用python的z3约束求解。

实际上v4可以看做v0,之后SBYTE1(v4)就是v1,SBYTE2(v4) 为v2;以此类推

z3可以解出

solution_values = [
    73, 83, 67, 84, 70, 123, 53, 53, 54, 52, 48, 48, 53, 102, 45, 50, 100, 100,
    56, 45, 52, 100, 57, 53, 45, 57, 100, 50, 55, 45, 48, 100, 98, 102, 52, 48,
    48, 49, 57, 54, 49, 57, 125
]
flag = []
for i in range(len(solution_values)):
    flag.append(chr(solution_values[i]))
print(''.join(flag))
# ISCTF{5564005f-2dd8-4d95-9d27-0dbf40019619}

WHERE

image-20231214080514798

IDA打开

image-20231214082750499

程序开始23行处设置了一个异常处理函数

  • 使用了 NtCurrentTeb() 函数来获取当前线程的TEB
  • 访问 NtTib 结构,从中获取 ExceptionList 成员的值。
  • 在Windows中,ExceptionList 是 TEB 的一部分,用于指向当前线程的异常链表的头部。
  • 异常链表用于管理当前线程的异常处理信息,当线程执行发生异常时,系统会根据这个链表找到对应的异常处理程序。

之后往下看,

image-20231214083436214

GetModuleHandleA函数 获取 kernel32.dll 动态链接库中的 AddVectoredExceptionHandler 函数的地址,而AddVectoredExceptionHandler 函数用于向进程中添加一个矢量化的异常处理程序。所以这里也是关于异常处理的操作。

接着,

image-20231214083622518

又一次通过 NtCurrentTeb() 函数来获取当前线程的TEB,这一次是通过访问TEB的 ProcessEnvironmentBlock 成员,最终获取了一个叫做 BeingDebugged 的成员的值。在Windows中, BeingDebugged 是用于指示当前进程是否被调试的,如果当前值为非零,表示进程正在被调试。

image-20231214083853664

接上面,如果进程没有被调试,则这里会进入401520中,

image-20231214083954918

这里看一下,似乎都是对调试器的操作,阻止动态分析。

还有一处loc_401660,点进去看看

image-20231214084425601

发现一小段花指令,去除后发现是一个TEA加密,但是目前不清楚是哪里的。

image-20231214084511856

再次返回主函数的时候,发现不见了。不知道是什么情况了,看了wp好像是 VEH异常处理还是SEH异常处理,不太懂(待学)

image-20231214084556145

往下看。

image-20231214084111919

第一部分flag的地方,可以用z3解出来。

再往下,

image-20231214084727331

先验证了 Str 长度为32,爆红的不知道什么,好像是什么空指针异常,想起上面讲的异常处理函数,

image-20231214085941647

点进去看,

image-20231214090000890

发现是一个魔改了一点的RC4

image-20231214090023692

接着看到 sub_401660,这里不就是1我们刚刚 修复的花指令处,虽然不懂具体的过程,但是这里应该就是 TEA加密。

再看下面。

image-20231214085158466

这里拿 刚刚 TEA加密后的密文,先是异或,将得到的数据作为一个二维数组的索引,把当前位置的值设置为1,最后比较返回0。

其实到这里就分析完了。好像也不是很难,但是当初纠结了好久。

逆向一下就好了。

但是其实现在也还有点疑惑,为什么TEA加密的时候的明文和key是相同的,解密的时候密文和key也可以相同,当时就是这里纠结不出来。o(╥﹏╥)o、

具体的EXP就不再写了,分析完了。主要是这个拖了好久了,今天补一下。可以去找官方wp。有EXP。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

台阶仪在大型基板应用有哪些

探针式轮廓仪&#xff08;台阶仪&#xff09;是一种用于测量物体表面轮廓和形状的仪器。在大型基板应用中&#xff0c;它可能被用于检测和分析半导体器件、平板显示屏、光伏电池板等大尺寸基板上的微小结构和形状。这样的测量对于确保生产质量、提高制造效率和优化工艺非常重要…

cfa一级考生复习经验分享系列(三)

从总成绩可以看出&#xff0c;位于90%水平之上&#xff0c;且置信区间全体均高于90%线。 从各科目成绩可以看出&#xff0c;所有科目均位于90%线上或高于90%线&#xff0c;其中&#xff0c;另类与衍生、公司金额、经济学、权益投资、固定收益、财报分析表现较好&#xff0c;目测…

张驰课堂:在线六西格玛认证,成就个人职业发展

随着数字化学习平台的兴起&#xff0c;六西格玛的学习方式更加灵活。以下是线上学习平台与传统面授培训的对比&#xff1a; 线上学习平台&#xff1a; 灵活性&#xff1a;学员可以根据自己的时间安排自学&#xff0c;不受地点限制。 成本效益&#xff1a;通常在线课程费用较低…

MySQL中的时间函数整理汇总

1.获取当前时间 -- 获取当前时间 SELECT NOW(); -- 获取当前日期 SELECT CURDATE(); -- 获取当前时分秒 SELECT CURTIME(); 2.获取对应日期对应的年/月/日/月份名/星期数 -- 返回对应日期对应的年/月/日/月份名/星期数 select year(now())as 年,month(now())as 月,day(now())…

迅速理解什么是通信前置机

通信前置机设在两个通信对象之间&#xff0c;是实质性的物理服务器&#xff0c;适应不同通信协议或数据格式之间的相互转换。 前置机的作用&#xff1a; 隔离——隔离客户端与服务端&#xff0c;保障后端安全减负——处理非核心业务&#xff0c;分担后端服务器压力&#xff0…

CBTC2024 • 零碳未来!CBTC上海储能技术展览会

国际氢能投融资与发展联盟、 湖南省电池产业协会 、沪粤储能产业联盟主办的一场备受瞩目的盛会——2024年CBTC上海国际储能技术展。储能技术是当今全球能源领域的核心热点之一&#xff0c;也是实现能源转型和可持续发展的重要途径。CBTC上海国际储能技术展是全球规模最大、最具…

临界资源访问一个有趣现象

先看一个例子&#xff1a;我们创建10个线程&#xff0c;每一个线程对同一个地址上的值都进行加一100000次&#xff0c;那最后结果是不是1000000呢&#xff1f; #include <stdio.h> #include <pthread.h> #include <unistd.h>#define THREAD_COUNT 10void …

阿里云Centos8安装Dockers详细过程

一、卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \do…

OpenHarmony应用编译 - 如何在源码中编译复杂应用

功能简介 在OpenHarmony系统中预安装应用的hap包会随系统编译打包到镜像中&#xff0c;目前有两种编译预安装应用hap包的方式&#xff0c;一种为随系统编译时&#xff0c;编译应用源码生成hap包的方式&#xff0c;另一种是将已生成的hap包放入系统源码中&#xff0c;再进行打包…

three.js聚光源SpotLight例子

效果&#xff1a; 说明&#xff1a;这里创建了SphereGeometry 球缓冲几何体&#xff0c;使用的材质是兰伯特网格材质MeshLambertMaterial&#xff0c;并对球缓冲几何体使用了纹理贴图效果&#xff0c;添加了聚光源&#xff0c;全部代码如下&#xff1a; <template><d…

Redis队列原理解析:让你的应用程序运行更加稳定!

一、消息队列简介 消息队列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放消息的队列。最简单的消息队列模型包括 3 个角色&#xff1a; 消息队列&#xff1a;存储和管理消息&#xff0c;也被称为消息代理&#xff08;Message Broker&#xff09;生产者…

java 执行linux 命令

文章目录 前言一、linux命令执行二、使用步骤三、踩坑 前言 java 执行linux 命令&#xff1b; 本文模拟复制linux文件到指定文件夹后打zip包后返回zip名称&#xff0c;提供给下载接口下载zip&#xff1b; 一、linux命令执行 linux命令执行Process process Runtime.getRunti…

【已解决】java 无法将类 XX类中的构造器 X应用到给定类型

原因&#xff1a; 实际参数列表和形式参数列表长度不同 解决方法&#xff1a; 给类添加AllArgsConstructor注解即可。

什么是跨站脚本攻击(XSS)?如何防止它?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

猫粮哪个牌子质量好性价比高?口碑比较好的主食冻干猫粮牌子推荐

猫咪生骨肉主食冻干猫粮喂养方式是越来越火了&#xff0c;作为一个离职的十年经验宠物护理师&#xff0c;对宠物健康营养方面的知识一直在研究&#xff0c;不光是为了我自己养的猫咪身体健康&#xff0c;也要为客户的猫咪健康负责&#xff01;现在很多养猫人士对主食冻干猫粮喂…

RocketMQ 服务搭建

目录 概述RocketMQ 单机服务搭建搭建架构相关地址前置操作NameServer 启动配置启动解决 java 版本的问题 Broker 启动测试关闭 结束 概述 学习此文&#xff0c;可以快速的搭建一个单机的 RocketMQ 服务。 RocketMQ 单机服务搭建 搭建架构 相关地址 RocketMQ官网地址二进制下…

什么台灯好用不伤眼睛?适合考公使用的台灯推荐

随着时代的发展与进步&#xff0c;不管是办公族还是学生党的压力也越来越大的&#xff0c;不少人在晚上回去之后仍然需要学习、工作&#xff0c;这样的一件试几乎成为了“家常便饭”&#xff0c;而这个过程中必不可少就是台灯。有些人为了保护眼睛会选择护眼台灯&#xff0c;但…

关于AISD300系列三相智能安全配电装置的详细介绍-安科瑞 蒋静

1概述 AISD300系列三相智能安全配电装置是安科瑞专为低压配电侧开发的一款智能安全配电产品&#xff0c;本产品主要针对低压配电系统人身触电、线路老化、短路、漏电等原因引起电气安全问题而设计。 产品主要应用于学校、加油站、医院、银行、疗养院、康复中心、敬老院、酒店…

大洋钻探系列之四“决心号”钻探船

乔迪斯决心号&#xff08;英文&#xff1a;JOIDES Resolution&#xff09;大洋钻探船是大洋钻探所使用的一艘钻探船&#xff0c;是美国Sedco公司和英国石油公司所属的一艘商用石油勘探船“Sedco/BP 471号”改装而来的。“乔迪斯”音译自地球深部取样海洋研究机构联合体&#xf…

Zebec 推出由 Visa、万事达网络支持的即时支付卡

“Zebec 现已推出全新的加密支付卡&#xff0c;该卡由 Visa、万事达网络支持&#xff0c;具备即时、多链、非托管、无需 KYC、免费等特性&#xff0c;其能够通过加密钱包与多条主流公链链接并直接调用支付&#xff0c;这将是加密支付领域的里程碑事件。” 在 2023 年的 12 月 8…