buuctf写题笔记一

2025-4-24 206 4/24

easyre

1.了解题目

(1)查看文件信息 无壳64位程序

buuctf写题笔记一

(2)运行程序

初步判断程序作用是一个验证flag的脚本

buuctf写题笔记一

2.逆向分析

前面已经了解到这个exe文件位64位程序,拖入ida64中进行反汇编 反汇编进去就发现了flag

buuctf写题笔记一

f5查看伪代码,发现是输入两个数,两个数如果相等就给flag

buuctf写题笔记一

buuctf写题笔记一

reverse1

1.了解题目

(1)查看文件信息 64位无壳

buuctf写题笔记一

(2)运行程序

运行完毕发现什么都没发生

buuctf写题笔记一

2.逆向分析

前面了解到程序为64位, ida64反汇编即可 按f5进入主函数

buuctf写题笔记一

发现存在一个main_0函数,点击进入main_0函数,函数如下:

buuctf写题笔记一

通过分析发现flag就是把 o 替换为 0 ,按R即可将十进制转化为字符

buuctf写题笔记一

双击str2即可查看值

buuctf写题笔记一

得到flag: flag{hell0_w0rld}

reverse2

1.了解题目

(1)查看文件信息

buuctf写题笔记一

(2)运行程序

初步确定程序为flag判断脚本

buuctf写题笔记一

2.逆向分析

拖入ida64

buuctf写题笔记一

双击flag变量查看值

buuctf写题笔记一

选中flag按A即可查看完整值,根据if语句替换字符即可得到flag

buuctf写题笔记一

内涵的软件

1.了解题目

(1)查看文件信息

buuctf写题笔记一

(2)运行题目

根据题目信息,发现应该是等5秒就会输出flag,但程序并没有对变量进行输出,反汇编查看变量值一个 就可以得到flag

buuctf写题笔记一

2.逆向分析

32位程序需要用到ida32进行反汇编

按f5查看反汇编后的main函数,发现main_0调用

buuctf写题笔记一

双击main_0进入函数

发现存在v5变量值为flag,没有发现明显的加密,确定其为答案

buuctf写题笔记一

新年快乐

1.了解题目

(1)查看文件信息

buuctf写题笔记一

(2)上面发现存在upx加壳,可以使用 upx.exe -d进行脱壳

buuctf写题笔记一

(3)再次查看文件信息,发现壳已经去除

buuctf写题笔记一

(4)运行程序

提示错误,初步判断这个是一个flag验证脚本

buuctf写题笔记一

2.逆向分析

前面发现是32位程序,拖入ida32即可

buuctf写题笔记一

xor

1.了解题目

(1)查看文件信息

可以看到此程序为64位macOS上的可执行程序,我这里没有macOS设备就不做运行

buuctf写题笔记一

2.逆向分析

前面发现是64位程序,拖入ida64进行反编译

进入就在main函数位置,按f5进行伪代码查看,分析程序如下:

buuctf写题笔记一

发现加密后的字符串为global,查看global的值

buuctf写题笔记一

点击global的值进行跳转

buuctf写题笔记一

选中这两行ctrl+E即可提取出字符串或数组

buuctf写题笔记一

提取出字符串了就要想怎么逆向算法来得到flag

前面发现xor加密,xor加密是对称的,如: a^b=c那么a^c=b ,xor加密如下

buuctf写题笔记一

上面他是前与前一位进行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)查看程序信息

buuctf写题笔记一

(2)运行程序

并没有出现任何输出

buuctf写题笔记一

2.逆向分析

前面发现程序为32位windows程序,拖入ida 32进行反汇编 1.进入之后并没发现主函数,而是start函数

buuctf写题笔记一

2.没有发现主函数可以通过两种方法确定main位置: 方法一:

shifit+F12进行字符串查看

buuctf写题笔记一

方法二:

定位到函数窗口, shift+F进行main函数搜索,有时ida并不能识别出main函数,因此这种方法不推荐

buuctf写题笔记一

3.通过方法一查找到的可以是主函数特征的字符串双击进入如下视图:

buuctf写题笔记一

4.跳转到main_0后, F5查看伪代码即可

buuctf写题笔记一

5.对可以看出的函数进行改名方便分析,鼠标移到函数位置按 N 即可重名函数

buuctf写题笔记一

6.双击击sub_4110BE进入函数

buuctf写题笔记一

buuctf写题笔记一

7.分析sub_4110BE

进入函数后发现一个算法,没必要看懂算法,查看特征即可

buuctf写题笔记一

进入图中要求进入的变量,发现为我们查看字符串时看到的编码表,结合上一步看到的位运算,判断其 为base64编码表,后续对函数进行重命名方便记忆

buuctf写题笔记一

8.进行对主函数进行分析

基本上结果一个出来了,将Str2的值提出出来减去j , base64解码就可以得到flag

buuctf写题笔记一

双击Str2拿到字符串

buuctf写题笔记一

9.还原flag

还原base64编码

c = "e3nifIH9b_C@n@dH" for i in range(len(c)):
print(chr(ord(c[i])-i),end="")
#e2lfbDB2ZV95b3V9

base64解码

buuctf写题笔记一

helloword

这题下载下来是一个apk文件

buuctf写题笔记一

1.了解题目

(1)查看题目信息

buuctf写题笔记一

(2)运行题目

运行题目不是必要步骤,我一般喜欢运行下题目,这里用到mumu模拟器来运行使用其他模拟器或手机 运行都可以

发现没有什么有用的信息,就和题目一样 helloworld

buuctf写题笔记一

2.逆向分析

分析apk和windows、 linux、 masos可执行文件不同,这里要用的jadx进行反编译

(1)jadx查看apk源码

资源文件下的AndroidManifest.xml文件可以查看到程序所使用的类(class)

buuctf写题笔记一

(2)发现主函数

buuctf写题笔记一

发现flag

buuctf写题笔记一

不一样的flag

1.了解题目

(1)查看文件信息

buuctf写题笔记一

(2)运行程序

运行程序发现提示上下左右,应该是类似走迷宫的题目

buuctf写题笔记一

2.逆向分析

(1)发现是32位,拖入32为ida进行分析

buuctf写题笔记一

(2)对迷宫进行路径推断

buuctf写题笔记一

得到flag:flag{222441144222}

SimpleRev

1.了解程序

(1)查看文件信息 64位linux程序无壳

buuctf写题笔记一

(2)运行程序

运行失败没关系, 一样可以逆向分析

buuctf写题笔记一

2.逆向分析

(1)ida64进行逆向查看

进入ida发现就停留在主函数

buuctf写题笔记一

直接f5查看伪代码

buuctf写题笔记一

(2)对Decry函数进行分析 双击进入Decry函数,如下:

buuctf写题笔记一

发现函数中存在if判断,并输出恭喜或重试等字段

buuctf写题笔记一

并在往上代码发现str2存在处理,判断str2就为我们输入flag

buuctf写题笔记一

发现对字符进行偏移量操作,这里类似凯撒加密并且只对大写字母进行处理,需要获取key

buuctf写题笔记一

分享开头程序,得到key

buuctf写题笔记一

继续向下分析代码发现对key进行了大写转小写,得到新的key

buuctf写题笔记一

得到str2的key后就是要求text了

buuctf写题笔记一

join看起来就像连接函数,进入确认为连接函数,得到 text=killshadow

buuctf写题笔记一

知道text和str2的key后就是要求出str2,这里我们可以直接使用脚本进行爆破,将如下脚本中v1改为爆 破对象即可

仔细观察不管v1是不是大小写都是同一个加密语句,只是出题者用代码量来加大分析而已

buuctf写题笔记一

爆破脚本

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}

[GXYCTF2019]luck_guy

1.了解题目

(1)查看文件信息

buuctf写题笔记一

(2)运行文件

应该是一个输入flag判断flag正不正确的脚本

buuctf写题笔记一

2.逆向分析

(1)ida64分析题目

进入题目后就在main函数

buuctf写题笔记一

直接f5进行伪代码查看

buuctf写题笔记一

(2)分析伪代码

buuctf写题笔记一

(3)对patch_me进行分析

进入patch_me

buuctf写题笔记一

发现get_flag点击进入,发现有我们运行时提示的信息,应该这个就是flag判断函数了

buuctf写题笔记一

(4)分析get_flag

在程序中发现如下代码段,可以判断出s就是flag

buuctf写题笔记一

对f1进行查看发现第一段flag

buuctf写题笔记一

查看f2并没有发现f2有值

buuctf写题笔记一

光标移动到f2,按X查看f2的交叉引用,发现f2只在get_flag中被调用

buuctf写题笔记一

f2操作代码如下:

buuctf写题笔记一

通过脚本计算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文件

buuctf写题笔记一

(2)运行程序

java class文件运行时是不能加后缀的 发现是一个flag判断脚本

buuctf写题笔记一

2.逆向分析

java程序要用到jadx进行逆向分析,对主函数进行查看

buuctf写题笔记一

分析main函数

buuctf写题笔记一

写出解密脚本

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_!
- THE END -

4月24日17:34

最后修改:2025年4月24日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论