【无标题】

文章分享了一系列攻防世界中的编程挑战,涉及无壳代码逆向、脚本编写、SMC处理、加密解密(如RC4、XOR、Base64)、APK分析、壳技术(如Aspack、UPX)以及Python和特定算法(如Xtea)的使用。作者详细描述了解决过程,包括使用IDAPro进行分析和调试。
摘要由CSDN通过智能技术生成

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函数

反编译

写脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值