BUUCTF 刷题日记

Java逆向解密

题目链接:BUUCTF在线评测 (buuoj.cn)

根据提示java逆向解密下载完附件后发现是class文件然后发现是用java写的所以这里我们有两种方法一种找个在线网站另一种即下载jd-gui,这里我用的是前者找了一个在线网站,但是里面会有一些乱码还是推荐使用后者,后者下载解压后即可使用下面为二者的网址

在线网站:JAVA反向工程网

jd-gui下载地址:Java Decompiler

下载完附件后用在线网站打开后即为下图所示
在这里插入图片描述

这里就是输入一个字符串经过for循环后进行异或,再看新字符串与key进行比较看是否相等,这里的64转为ascll码字符即为’@'所以经过百度后写出脚本

key=[180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
flag=“”

for i in range(len(key)):
flag+=chr((key[i]^32)-ord(‘@’))

print (flag)
然后得出结果为,在加上flag即可。
在这里插入图片描述

SimpleRev

题目链接:[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#SimpleRev)

下载完附件先拖进PE里面,看看有没有壳,发现无壳且是64位程序
在这里插入图片描述

然后用ida64位打开,进去先查找字符串发现下图然后ctrl加x交叉引用
在这里插入图片描述

在这里插入图片描述

然后f5查看伪代码并把下面100、68、113、83转化为ascll码如图
在这里插入图片描述

函数对text,key进行了一系列的赋值,再把key中的大写字母变成小写字母,再把key中的字母进行一系列的变换后写入str2,最后str2和text进行比较,如果相同则 Congratulation!
在伪代码里面发现了一个decry的函数这里跟进如下图,并将十六进制转化为ascll码
在这里插入图片描述

这里涉及了大小端序的问题,可以去百度或者用先进的chatgpt去了解这些知识,举一个例子来说是对于一个四字节整数值0x12345678,小端序的内存表示方式为0x78 0x56 0x34 0x12即最低有效字节存储在内存的最低地址,而最高有效字节存储在最高地址而对于大端序则刚好相反。

而本题则是两个十六进制是大端序,但是数据在内存中都是小端序,所以要将其反转一下。一般而言在cpu中x86都是小端序,但是此题IDA却将之转换为了大端序,反转结果即src为NDCLS,v9[0]=hadow,而key3通过进一步观察可得出其为kills

在上图中我们可以发现有一个join函数,这里是将key3与v9连起来形成一个新的字符串,所以text为killshadow

而strcpy函数则是将key1的值赋给key,而key1为ADSFK,所以此处的key也为ADSFK
在这里插入图片描述

在decry函数中还有一个strcat函数,它的作用是将key和src连在一起形成一个新的字符串即key=ADSFKNDCLS,所以v5=10将数字变成ascll码,而最下面的if语句,如果!strcmp(text ,str2)则正确,strcmp函数是用来比较函数,如果两个字符串相同,则等于0,所以text = str2才成功
在这里插入图片描述

接下来就是写脚本
#include<stdio.h>
int main()
{
char key[] = “adsfkndcls”; //key字符串是adsfkndcls
char text[] = “killshadow”; //text字符串是killshadow
int i; //定义了变量 i
int v2 = 0;
int v3 = 10;//v3的长度为10 ,因为在大写字母变小写的时候,v3会++,而字符串变了10次。
int v5 = 10;
for (int i = 0; i < v5; i++)//开始循环
{
for (int j = 0; j < 123; j++)//开始第二重循环 j = v1;
{
if ((j < ‘A’ || j > ‘Z’) || (j < ‘z’ && j > ‘a’))//|| 和 && 交换 > 和 < 交换 ,让j不再那个范围之内
{
continue;//如果不在范围之内,就跳过本次循环。
}
if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i])//执行这个算法,跟text字符串相比,如果相等就输出
//这个字符
{
printf(“%c”,j);
v3++;//注意算法里面 v3++,所以这里也要把v3++;
break;
}
}
}
}
而这里v3=10当时脑子突然短路就不知道为啥了,再去看伪代码,因为i<v5,而v5则是key的长度即是10,而在for循环中i是从0开始的,又因为小于10所以有0到9十个数字,所以v3它等于10

将此脚本运行即可得出代码。

[GXYCTF2019]luck_guy

题目链接:https://buuoj.cn/challenges#[GXYCTF2019]luck_guy
下载完文件后拖入PE查壳,发现无壳是64bit程序
在这里插入图片描述

然后用ida64打开后查找字符串发现了flag的前半部分为GXY{do_not_
在这里插入图片描述
然后我们进入main函数查看伪代码,发现其是输入数字储存进v4执行patch_me函数
在这里插入图片描述
然后打开patch_me函数发现若为偶数进入get_flag函数
在这里插入图片描述

在这里插入图片描述
这里用switch函数,大致经过是case4 case5 case1
所以直接写一个脚本进行爆破
脚本如下:
flag=‘GXY{do_not_’
f2=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f,0]
v1=[]
for i in range(8);
if(i%2==1)
v1.append(f2[i]+i-2)
else
v1.append(f2[i]+i-1)
f2[i]=v1[i]-1
flag+=chr(f2[i])
print(flag)
运行即可得到代码,而上述脚本的f2值是将case4的s值转为十六进制再按照端序排列,具体参照第二道题simplerev中的例子,爆破出flag后再根据题目要求上传即可
在这里插入图片描述

简单注册器

题目链接:https://buuoj.cn/challenges#%E7%AE%80%E5%8D%95%E6%B3%A8%E5%86%8C%E5%99%A8
发现是apk文件,百度后得知是从apkide打开
在这里插入图片描述
然后再用反编译工具jeb,用它反编译后再按tab键即可得出代码,搜索flag,找到关键词,flag为dd2940c04462b4dd7c450528835cca15这串字符进行相关加密得到的,所以这里根据代码写一个脚本
在这里插入图片描述
这道题的两张图片为网上所找,因为懒得在配置了
脚本如下:
str=[‘d’,‘d’,‘2’,‘9’,‘4’,‘0’,‘c’,‘0’,‘4’,‘4’,‘6’,‘2’,‘b’,‘4’,‘d’,‘d’,‘7’,‘c’,‘4’,‘5’,‘0’,‘5’,‘2’,‘8’,‘8’,‘3’,‘5’,‘c’,‘c’,‘a’,‘1’,‘5’]
str[2]=chr(ord(str[2])+ord(str[3])-50)
str[4]=chr( ord(str[2])+ord(str[5])-0x30 )
str[30]=chr( ord(str[0x1f])+ord(str[9])-0x30)
str[14]=chr( ord(str[27])+ord(str[28])-97 )
for i in range(16):
x=str[0x1f-i]
str[0x1f-i]=str[i]
str[i]=x
for i in str:
print (i,end=“”)
这个脚本可以说是很简单了,根据题目要求加密即可没什么大难度,这是第一道接触的安卓逆向就稍稍记录一下吧。
脚本运行如下图
在这里插入图片描述
所以flag为flag{59acc538825054c7de4b26440c0999dd}

总结

学习之路还很漫长还有好多题要刷,加油加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值