SHCTF 山河CTF Reverse方向[Week1]全WP 详解

2023-10-29 21:30

本文主要是介绍SHCTF 山河CTF Reverse方向[Week1]全WP 详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • [WEEK1]ez_asm
  • [WEEK1]easy_re
  • [WEEK1]seed
  • [WEEK1]signin
  • [WEEK1]easy_math
  • [WEEK1]ez_apk

[WEEK1]ez_asm

在这里插入图片描述
从上往下读,第一处是xor 1Eh,第二处是sub 0Ah;逆向一下先加0A后异或1E
写个EXP

data = "nhuo[M`7mc7uhc$7midgbTf`7`$7%#ubf7 ci5Y"
result = ''for char in data:xor_value = (ord(char)+0x0A) ^ 0x1Eresult += chr(xor_value)print(result.encode('utf-8').decode('unicode_escape'))

flag{It_is_als0_impor@nt_t0_13arn_4sm!}

[WEEK1]easy_re

在这里插入图片描述
对输入的Str做一个for循环处理,再与des比较
取出des中的数据,逆向一下;

# 已知的des数组
des = [ 0x66, 0xC6, 0x16, 0x76, 0xB7, 0x45, 0x27, 0x97, 0xF5, 0x47,0x03, 0xF5, 0x37, 0x03, 0xC6, 0x67, 0x33, 0xF5, 0x47, 0x86,0x56, 0xF5, 0x26, 0x96, 0xE6, 0x16, 0x27, 0x97, 0xF5, 0x07,0x27, 0x03, 0x26, 0xC6, 0x33, 0xD6, 0xD7]# 创建一个空列表来存储计算得到的Str
Str = []# 逆向计算Str
for value in des:# 首先计算右移4位,然后按位或上16倍的值Str_value = (value >> 4) | (16 * value)# 将计算得到的值添加到Str列表中Str.append(hex(Str_value))# 打印计算得到的Str
print(Str)
Str=['0x666', '0xc6c', '0x161', '0x767', '0xb7b', '0x454', '0x272', '0x979', '0xf5f', '0x474', '0x30', '0xf5f', '0x373', '0x30', '0xc6c', '0x676', '0x333', '0xf5f', '0x474', '0x868', '0x565', '0xf5f', '0x262', '0x969', '0xe6e', '0x161', '0x272', '0x979', '0xf5f', '0x70', '0x272', '0x30', '0x262', '0xc6c', '0x333', '0xd6d', '0xd7d']

再做一下处理,因为这里可以发现66是f,6c是l,61是a;这样就可以推测取俩位是flag

# 提取每个元素的后两位字符(十六进制字符)
enflag= [s[-2:] for s in Str]
# 转换每个十六进制字符为ASCII字符
flag = [chr(int(hex_str, 16)) for hex_str in enflag]# 使用join()方法将ASCII字符合并成一个字符串
result = ''.join(flag)# 打印合并后的字符串
print(result)

flag{Try_t0_s0lv3_the_binary_pr0bl3m}

[WEEK1]seed

在这里插入图片描述
查壳 64bit无壳 用ida64打开
在这里插入图片描述
逻辑很清晰,随机数生成存到v5里面,与输入的v6依次异或,然后和des比较;逆向一下就是用des里面的数据和随机数异或就可以了;都知道,rand()实际上是伪随机数,这里我们用动态调试就可以看到。
在这里插入图片描述
随便下个断点,只要在rand后就好,这里就是了。

enc = [0x26, 0x45, 0x49, 0x8E, 0xB9, 0x43, 0xCD, 0x9B, 0xFA, 0x0C]
des = [64, 41, 40, 233, 194, 4, 164, 237, 159, 83, 95, 117, 60, 209, 205, 43, 168, 196, 137, 105, 21, 33, 22, 239, 215,39, 146, 223, 202, 83, 95, 42, 60, 209, 206, 3, 163, 239, 165, 120, 22, 26, 45, 225, 196]# 创建一个空列表来存储计算得到的ASCII字符
result = []for i in range(len(des)):result.append(chr(des[i] ^ enc[i % 10]))  # 使用chr()将整数转为ASCII字符# 使用join()方法将ASCII字符合并成一个字符串
output = ''.join(result)# 打印合并后的ASCII字符串
print(output)
# flag{Give_y0u_the_se3d_and_D0_you_w@nt_t0_do}

[WEEK1]signin

在这里插入图片描述
在这里插入图片描述
ida打开后 flag{flag1sinarray}

[WEEK1]easy_math

py文件打开

在这里插入图片描述
源代码的解释一下:将输入的长度为42的flag分为长度为7的六个十六进制;这六个十六进制满足下列条件;这里可以用Z3约束求解得出六个数,再转换成ascii就🆗了;

Z3约束不懂得骨骼一下;学习;

exp:

from z3 import *v = Real('v')
w = Real('w')
x = Real('x')
y = Real('y')
z = Real('z')
c = Real('c')
s = Solver()s.add(593*v + 997*w + 811*x + 258*y + 829*z + 532*c == 0x5b8e0aef71d34ff43)
s.add(605*v + 686*w + 328*x + 602*y + 695*z + 576*c == 0x551a262360964ef7f)
s.add(373*v + 512*w + 449*x + 756*y + 448*z + 580*c == 0x49d158a5657d6931c)
s.add(560*v + 635*w + 422*x + 971*y + 855*z + 597*c == 0x625568d5abbabf4f3)
s.add(717*v + 507*w + 388*x + 925*y + 324*z + 524*c == 0x50ee0c025e70e3c23)
s.add(312*v + 368*w + 884*x + 518*y + 495*z + 414*c == 0x40e735f8aa2815f65)
result = []
if s.check() == sat:result = s.model()
print(result)
# 这里输出得result顺序不对所以修改了一下,得到下面得enc
enc = [28829613228248624, 26827458353261422, 13642136288051316, 29378135513658469, 32192963475959391, 30791965425607037]
enc1 = []
flag = []
for i in range(6):enc1.append(hex(enc[i])[2:])for j in range(0,14,2):flag.append(enc1[i][j:j+2])print(flag)
print("".join([chr(int(hex_str,16))for hex_str in flag]))
# flag{N0_One_kn0ws_m@th_B3tter_Th@n_me!!!!}

[WEEK1]ez_apk

在这里插入图片描述

用JEB(其他apk反编译工具应该也可以)打开,先看MainActivity,
在这里插入图片描述
这里获取我们的输入,也就是input_1控件的内容,然后用“encrypt.encode”方法对其进行编码,将结果存储进s中,最后和字符串“ ”比较,相等就输出flag正确;

在这里插入图片描述
看到上面有一个字符串,留意一下;下面就是encode。encode中还调用了一个divmod来将256进制转化为58进制的数,这里encode和divmod就是一个base58编码的过程;

还有一种判断方法,base58的特征:相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号,最主要的是后面不会出现’='。观察一下可以发现,无论是码表还是编码后的内容都没有这些特征值,这样也可以判断Base58编码;

在这里插入图片描述

编码网站:cyberchef

这篇关于SHCTF 山河CTF Reverse方向[Week1]全WP 详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/303460

相关文章

SpringIoC与SpringDI详解

《SpringIoC与SpringDI详解》本文介绍了Spring框架中的IoC(控制反转)和DI(依赖注入)概念,以及如何在Spring中使用这些概念来管理对象和依赖关系,感兴趣的朋友一起看看吧... 目录一、IoC与DI1.1 IoC1.2 DI二、IoC与DI的使用三、IoC详解3.1 Bean的存储

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

MySql中的数据库连接池详解

《MySql中的数据库连接池详解》:本文主要介绍MySql中的数据库连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql数据库连接池1、概念2、为什么会出现数据库连接池3、原理4、数据库连接池的提供商5、DataSource数据源6、DBCP7、C

Spring-AOP-ProceedingJoinPoint的使用详解

《Spring-AOP-ProceedingJoinPoint的使用详解》:本文主要介绍Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的参考价值,希望对大家有所帮... 目录ProceedingJoinPoijsnt简介获取环绕通知方法的相关信息1.proceed()2.g

一文详解kafka开启kerberos认证的完整步骤

《一文详解kafka开启kerberos认证的完整步骤》这篇文章主要为大家详细介绍了kafka开启kerberos认证的完整步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、kerberos安装部署二、准备机器三、Kerberos Server 安装1、配置krb5.con