1.攻防世界BABYRE
最近在搞一个很头疼的smc,所以找了个简单的题也算是个过度了
下载附件,64位无壳,ida打开:
第八行对judge函数进行了异或,并且judge打不开
因为下了ida8.3,老版本的好多函数指令好像都变样子了(bushi,查了很多的wp脚本都用不了,有可能是我的问题,脚本运行后:
。。。。。
从函数开始一直选到结束,按c,找到函数名p重写函数,f5反编译
a=[102,109,99,100,127,107,55,100,59,86,96,59,110,112]
b='' "”
c=0
for i in a:
b+=chr(i^c) c+=1
print(b)
2.[网鼎杯 2020 青龙组]jocker
和上一篇攻防世界的题差不多,也是写脚本过smc
32位没壳,拖进ida
被smc的是encrypt函数,找到其位置0x401500
主函数循环了187次,写脚本
运行脚本,全选函数,依次按u c,再p重写函数
写代码
怪事,flag怎么才给一半
最后还有一个finally函数
写脚本解密
flag{d07abccf8a410cb37a}
3.hctf Wuyu6a的猫猫寻找器
下载附件,apk文件拖进jeb
乍一看是一个简单的rc4解密,key和密文都给了,直接解密就行
解密出来一看就不对(怎么做不出来还骂人呢(bushi)
用雷电模拟器打开,mt管理器可以找到
这里有一个问题,模拟器不开root权限找不到数据目录,开权限之后打开数据目录
找到一个新的apk
安装导出之后用jeb打开,可以找到真正的密文
解密之后找到真正的flag
4.hctf pvz
下载,打开,ce找到进程
扫描阳光初始值150,种一个豌豆之后再次扫描阳光50,获得阳光地址
修改阳光数,发现僵尸打不死,百度搜索僵尸初始血量270
被打之后找到变化的值,为僵尸血量地址
f6找到访问改地址的指令
(地址找错了,改变数值的地址不止一个,往下翻可以找到正确地址)add让血量越来越高,改成sub
接下来你就玩吧,一玩一个不吱声
5.攻防世界Windows_Reverse2
附件下载,拖进查壳工具
Aspack壳,拖进x32dbg手动脱壳
在call处内存访问下硬件访问断点,f9找到popad,基本上就离oep不远了
脱壳,拖进ida
查看第一个if条件中的sub_CD11F0函数
长度为二的倍数,且处于0到9,A到F之间;
接着查看sub_CD1240函数
这个函数比较重要所以逐步分析:
第一个if判断长度是否为零,如果不是零就判断字符是否在0到9或者A到F的范围内,内部操作-55:例如A的ascll码值为65,所以A到F可以转化为10到15,符合十六进制,所以函数是转十六进制
下一个if内容和这个一样, v3 += 2;可以判断出v5,v6是数组中相邻的两个元素
v7 = (unsigned int)v3 >> 1;右移两位相当于除以2,v7是每组v5v6的索引
v11[v7 - 1] = v4 | (16 * v9);
:这一行计算了两个字符转换后的十六进制数,并将其存储到数组 v11
中。
重点是返回值sub_CD1000
dword_CD203C(v22, (unsigned __int8)byte_CD3020[(unsigned __int8)*(&v17 + i)] ^ 0x76);
提取byte_CD3020数组中的元素,与0x76异或可得base64原表
基本可以判断这个函数的base64加密。
解密脚本
提取x后的内容
adebdeaec7be
转成大写加上flag前缀就好
6.攻防世界crackme
查壳,发现是北斗壳
在call esp突变数据窗口跟随下断点
接着f8步入
找到call,脱壳
ida分析主函数
基本可以判断flag长度在42,查看两个数组的具体内容,shift加e提取数据(不知道为啥好多零,把零删了)
扒拉个脚本出来
flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
7.[SWPUCTF 2022 新生赛]py1
下载附件
把pyinstxtractor.py复制到该目录下,终端输入指令
打开文件夹
改成pyc文件,用hxd添加文件开头魔数
将pyc文件改成py文件
NSSCTF{k0nw_of_r3}
8.[MoeCTF 2021]welcome_to_the_world_of_re
64位
拖进ida查看伪代码,注意到if判断条件,下断点
f8到分叉路,想要跳转到左边,修改zf的值为0
查看汇编,找到flag
moectf{W31C0Me_t0_m03CTF_2021_w0o0o0oooo0ooooo0o0oooo0!!!}
攻防世界
9.666
10.1000Click
拖进ida查看字符串
ctrl+f 搜索flag,发现有一群flag
但是只有一个字符串被函数调用,
flag{TIBntXVbdZ4Z9VRtoOQ2wRlvDNIjQ8Ra}
但是据说点一千下真的有flag
11.debug
net文件,拖进dnspy
动调,断点设在入口点,找到主函数
根据提示,flag和ab有关系,下断点
发现flag
12.testre
脱进ida,查看字符
啊~~好像base64变表啊
但是解了一下好像没有这么简单
看了题解发现除的是58所以是base68加密(bushi,私斋蒸油事理)
这还有个拼接的字符串,胆大猜测是密文
解出flag(我搞出西湖论剑了,我蒸油事理)
13.maze
四个判断上下左右的函数
字符串找到地图
def find_shortest_path(maze, start, end): rows, cols = len(maze), len(maze[0]) visited = [[False] * cols for _ in range(rows)] queue = [[start, ""]] # 在队列中同时保存当前位置和移动路径 visited[start[0]][start[1]] = True dirs = [(0, 1, "o"), (1, 0, "0"), (0, -1, "O"), (-1, 0, ".")] # 右, 下, 左, 上 dsaw steps = 0 while queue: for _ in range(len(queue)): # 遍历队列中的每个状态 pos, path = queue.pop(0) if pos == end: return path # 返回实际的最短路径 for dr, dc, move in dirs: next_pos = (pos[0] + dr, pos[1] + dc) if 0 <= next_pos[0] < rows and 0 <= next_pos[1] < cols and maze[next_pos[0]][next_pos[1]] == 0 and not \ visited[next_pos[0]][next_pos[1]]: visited[next_pos[0]][next_pos[1]] = True new_path = path + move queue.append([next_pos, new_path]) steps += 1 return None # 无解时返回None # 迷宫表示,0表示可以通过的路,1表示墙壁 maze = [ [0, 0, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 1], [1, 1, 1, 0, 1, 0, 1, 1], [1, 1, 0, 0, 1, 0, 1, 1], [1, 0, 0, 1, 0, 0, 0, 1], [1, 1, 0, 1, 1, 1, 0, 1], [1, 1, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1]] start = (0, 0) # 起点坐标 end = (4, 4) # 终点坐标 shortest_path = find_shortest_path(maze, start, end) if shortest_path: print("最短路径为:", shortest_path) else: print("没有找到路径") 解密脚本
o.O
14.easyRE1
人真好
nss合集
15.[羊城杯 2020]login
python逆向之后
解函数
顺序换了
md5加密得到flag 58964088b637e50d3a22b9510c1d1ef8
16.[SWPUCTF 2022 新生赛]xor
17.[羊城杯 2020]easyre
先看第一个加密函数
本判断为base64加密
第二个加密函数
分成四段重组
第三个加密函数自定义,写脚本解密
结果base64解密一下
18.[SWPUCTF 2022 新生赛]贪吃蛇
ida64位打开
第三个函数里有flag关键字
直接动调没有结果
jnz改成jz(75改成74)
在跳转下断点,动调
改zf,f8,双击t_flag,提取数据
19.[HNCTF 2022 WEEK2]getflag
ctrl+x找到引用函数
改条件,jg改成jle(7F改7E)
再次运行得到flag
20.[HNCTF 2022 WEEK2]TTTTTTTTTea
xtea加密
from ctypes import * import binascii from Crypto.Util.number import * def encrypt(v, key): v0, v1 = c_uint32(v[0]), c_uint32(v[1]) delta = 0x61C88647 total = c_uint32(0) for i in range(32): v0.value += (((v1.value * 16) ^ (v1.value >> 5)) + v1.value) ^ (total.value + key[total.value & 3]) total.value += delta v1.value += (((v0.value * 16) ^ (v0.value >> 5)) + v0.value) ^ (total.value + key[(total.value >> 11) & 3]) return v0.value, v1.value def decrypt(v, key): v0, v1 = c_uint32(v[0]), c_uint32(v[1]) delta = 0x61C88647 total = c_uint32(delta * -32) for i in range(32): v1.value -= (((v0.value << 4) ^ (v0.value >> 5)) + v0.value) ^ (total.value + key[(total.value >> 11) & 3]) total.value += delta v0.value -= (((v1.value << 4) ^ (v1.value >> 5)) + v1.value) ^ (total.value + key[total.value & 3]) return v0.value, v1.value # test if __name__ == "__main__": key = [0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F] res = [0xC11EE75A, 0xA4AD0973, 0xF61C9018, 0x32E37BCD, 0x2DCC1F26, 0x344380CC] res2 = [0x1, 0x1] for i in range(0, len(res), 2): # print(i) res2 = [0x1, 0x1] res2[0] = res[i] res2[1] = res[i + 1] res22 = decrypt(res2, key) print(str(long_to_bytes(res22[0])[::-1]) + str(long_to_bytes(res22[1])[::-1]), end="") """ Data is : 0x12345678 0x78563412 Encrypted data is : 0xae685ec7 0x59af4238 Decrypted data is : 0x12345678 0x78563412 """
21.[BJDCTF 2020]JustRE
拖进ida查看字符串
发现一个可疑的东西
点进去交叉引用
把两个%换成19999和0
就是flag
22.[NISACTF 2022]sign-ezc++
搜索Human找到关键函数和数组
脚本
23.[广东省大学生攻防大赛 2022]pyre
下载附件
反编译之后
脚本
一开始搞错了%和除不一样
24.[SWPUCTF 2023 秋季新生赛]UPX
指令脱壳
拖进ida
25.[HNCTF 2022 WEEK2]e@sy_flower
拖进ida,发现花指令,nop掉
按p重写main函数
反编译
写脚本