easyre
1.了解题目
(1)查看文件信息 无壳64位程序
(2)运行程序
初步判断程序作用是一个验证flag的脚本
2.逆向分析
前面已经了解到这个exe文件位64位程序,拖入ida64中进行反汇编 反汇编进去就发现了flag
f5查看伪代码,发现是输入两个数,两个数如果相等就给flag
reverse1
1.了解题目
(1)查看文件信息 64位无壳
(2)运行程序
运行完毕发现什么都没发生
2.逆向分析
前面了解到程序为64位, ida64反汇编即可 按f5进入主函数
发现存在一个main_0函数,点击进入main_0函数,函数如下:
通过分析发现flag就是把 o 替换为 0 ,按R即可将十进制转化为字符
双击str2即可查看值
得到flag: flag{hell0_w0rld}
reverse2
1.了解题目
(1)查看文件信息
(2)运行程序
初步确定程序为flag判断脚本
2.逆向分析
拖入ida64
双击flag变量查看值
选中flag按A即可查看完整值,根据if语句替换字符即可得到flag
内涵的软件
1.了解题目
(1)查看文件信息
(2)运行题目
根据题目信息,发现应该是等5秒就会输出flag,但程序并没有对变量进行输出,反汇编查看变量值一个 就可以得到flag
2.逆向分析
32位程序需要用到ida32进行反汇编
按f5查看反汇编后的main函数,发现main_0调用
双击main_0进入函数
发现存在v5变量值为flag,没有发现明显的加密,确定其为答案
新年快乐
1.了解题目
(1)查看文件信息
(2)上面发现存在upx加壳,可以使用 upx.exe -d进行脱壳
(3)再次查看文件信息,发现壳已经去除
(4)运行程序
提示错误,初步判断这个是一个flag验证脚本
2.逆向分析
前面发现是32位程序,拖入ida32即可
xor
1.了解题目
(1)查看文件信息
可以看到此程序为64位macOS上的可执行程序,我这里没有macOS设备就不做运行
2.逆向分析
前面发现是64位程序,拖入ida64进行反编译
进入就在main函数位置,按f5进行伪代码查看,分析程序如下:
发现加密后的字符串为global,查看global的值
点击global的值进行跳转
选中这两行ctrl+E即可提取出字符串或数组
提取出字符串了就要想怎么逆向算法来得到flag
前面发现xor加密,xor加密是对称的,如: a^b=c那么a^c=b ,xor加密如下
上面他是前与前一位进行xor ,因此倒数第一位和倒数第二位才能计算出原本的第一位,即先求 b[32] 最后求 b[1] , b[0] 不变
通过编写一个python脚本来还原flag:
c_flag = "f\nk\fw&O.@\x11x\rZ;U\x11p\x19F\x1Fv\"M#D\x0Eg\x06h\x0FG2O" flag = ""
for i in range(1,len(c_flag)):
flag+=chr(ord(c_flag[len(c_flag)-i])^ord(c_flag[len(c_flag)-i-1])) print("f"+flag[::-1])
#flag{QianQiuWanDai_YiTongJiangHu}
reverse3
1.了解程序
(1)查看程序信息
(2)运行程序
并没有出现任何输出
2.逆向分析
前面发现程序为32位windows程序,拖入ida 32进行反汇编 1.进入之后并没发现主函数,而是start函数
2.没有发现主函数可以通过两种方法确定main位置: 方法一:
shifit+F12进行字符串查看
方法二:
定位到函数窗口, shift+F进行main函数搜索,有时ida并不能识别出main函数,因此这种方法不推荐
3.通过方法一查找到的可以是主函数特征的字符串双击进入如下视图:
4.跳转到main_0后, F5查看伪代码即可
5.对可以看出的函数进行改名方便分析,鼠标移到函数位置按 N 即可重名函数
6.双击击sub_4110BE进入函数
7.分析sub_4110BE
进入函数后发现一个算法,没必要看懂算法,查看特征即可
进入图中要求进入的变量,发现为我们查看字符串时看到的编码表,结合上一步看到的位运算,判断其 为base64编码表,后续对函数进行重命名方便记忆
8.进行对主函数进行分析
基本上结果一个出来了,将Str2的值提出出来减去j , base64解码就可以得到flag
双击Str2拿到字符串
9.还原flag
还原base64编码
c = "e3nifIH9b_C@n@dH" for i in range(len(c)):
print(chr(ord(c[i])-i),end="")
#e2lfbDB2ZV95b3V9
base64解码
helloword
这题下载下来是一个apk文件
1.了解题目
(1)查看题目信息
(2)运行题目
运行题目不是必要步骤,我一般喜欢运行下题目,这里用到mumu模拟器来运行使用其他模拟器或手机 运行都可以
发现没有什么有用的信息,就和题目一样 helloworld
2.逆向分析
分析apk和windows、 linux、 masos可执行文件不同,这里要用的jadx进行反编译
(1)jadx查看apk源码
资源文件下的AndroidManifest.xml文件可以查看到程序所使用的类(class)
(2)发现主函数
发现flag
不一样的flag
1.了解题目
(1)查看文件信息
(2)运行程序
运行程序发现提示上下左右,应该是类似走迷宫的题目
2.逆向分析
(1)发现是32位,拖入32为ida进行分析
(2)对迷宫进行路径推断
得到flag:flag{222441144222}
SimpleRev
1.了解程序
(1)查看文件信息 64位linux程序无壳
(2)运行程序
运行失败没关系, 一样可以逆向分析
2.逆向分析
(1)ida64进行逆向查看
进入ida发现就停留在主函数
直接f5查看伪代码
(2)对Decry函数进行分析 双击进入Decry函数,如下:
发现函数中存在if判断,并输出恭喜或重试等字段
并在往上代码发现str2存在处理,判断str2就为我们输入flag
发现对字符进行偏移量操作,这里类似凯撒加密并且只对大写字母进行处理,需要获取key
分享开头程序,得到key
继续向下分析代码发现对key进行了大写转小写,得到新的key
得到str2的key后就是要求text了
join看起来就像连接函数,进入确认为连接函数,得到 text=killshadow
知道text和str2的key后就是要求出str2,这里我们可以直接使用脚本进行爆破,将如下脚本中v1改为爆 破对象即可
仔细观察不管v1是不是大小写都是同一个加密语句,只是出题者用代码量来加大分析而已
爆破脚本
key = 'adsfkndcls' text = 'killshadow'
for i in range(len(text)): for n in range(128):
if ord('A')<= n <= ord('Z') or ord('a')<= n <= ord('z'):
if (ord(text[i]))==((n + 39 - ord(key[i]) + 97) % 26 + 97):
print(chr(n),end="") break
#解密得到KLDQCUDFZO
flag:flag{KLDQCUDFZO}
1.了解题目
(1)查看文件信息
(2)运行文件
应该是一个输入flag判断flag正不正确的脚本
2.逆向分析
(1)ida64分析题目
进入题目后就在main函数
直接f5进行伪代码查看
(2)分析伪代码
(3)对patch_me进行分析
进入patch_me
发现get_flag点击进入,发现有我们运行时提示的信息,应该这个就是flag判断函数了
(4)分析get_flag
在程序中发现如下代码段,可以判断出s就是flag
对f1进行查看发现第一段flag
查看f2并没有发现f2有值
光标移动到f2,按X查看f2的交叉引用,发现f2只在get_flag中被调用
f2操作代码如下:
通过脚本计算f2
f2 = '\x7Ffo`guci'[::-1]
#小端序转大端字符串
r = ""
for x in range(8):
if x % 2 == 1:
r += chr(ord(f2[x])-2)
else:
r += chr(ord(f2[x])-1)
print(r)
#hate_me}
得到flag:GXY{do_not_hate_me},让要求提交为flag{do_not_hate_me}
Java逆向解密
1.了解题目
(1)查看题目信息
是一个java的class文件
(2)运行程序
java class文件运行时是不能加后缀的 发现是一个flag判断脚本
2.逆向分析
java程序要用到jadx进行逆向分析,对主函数进行查看
分析main函数
写出解密脚本
KEY = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
for x in KEY:
print(chr((x^32)-ord('@')),end='')
#This_is_the_flag_!
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://guofun.top/ctf/ctf-reverse/401/
共有 0 条评论