Reverse

本文记录了作者在CTF逆向分析挑战中遇到的各种问题及解决方案,涉及RSA加密、base64解密、字符串混淆、移位加密、APK分析等多个方面。通过IDA Pro工具进行动态和静态分析,结合编程技巧解密隐藏的flag。文章还分享了对于程序存储结构、小端序理解的重要性,并提供了部分题目的解题思路和参考资源。
摘要由CSDN通过智能技术生成

IDA中文不显示解决

参考链接
VScode中文乱码解决参考链接
(1 ~ 10攻防世界)(11~20为Buu,近乎为shift + F12查找字符串)

1. xxxorrr

题目链接
题目WP
心得:可能会有其它隐藏函数对所需结果进行操作

2. SignIn

RSA算法介绍
c是密文,m是明文,e是公钥,d是私钥,n=pq
RSA

题目链接:其中用到GMP
题目WP

3. IgniteMe

题目链接
题目WP

4. python-trade

题目链接
题目WP

5. 流浪者

题目链接
题目WP

6. csaw2013reversing2

题目链接
题目WP

7. BABYRE

题目链接
题目WP

input = "fmcd" + chr(0x7f) + "k7d;V`;np"
res = ''
for i, c in enumerate(input): # enumerate枚举,将其元素对应数组下标
    res += chr(ord(c) ^ i)
print(res)

"""output
flag{n1c3_j0b}
"""

8. CTFshow re2

rc4加密
题目链接
题目WP

9. 666

题目链接
题目WP

10. re1

题目链接
简单WP

11. reverse1

Buuctf reverse1
题目wp

12. reverse2

Buuctf reverse2
题目WP

13. 内涵的软件

Buuctf 内涵的软件
题目wp

14. 新年快乐

Buuctf 新年快乐

  1. upx -d 脱壳
  2. 题目WP2

15. xor

Buuctf xor
tap1
IDA shift + e 提取static字符串

flag = ""
static = (102, 10, 107, 12, 119, 38, 79, 46, 64, 17,
          120, 13, 90, 59, 85, 17, 112, 25, 70, 31,
          118, 34, 77, 35, 68, 14, 103, 6, 104, 15,
          71, 50, 79,)
print('f', end = "")
for i in range(1, len(static)):
    flag += chr(static[i] ^ static[i - 1])
print(flag)

17. helloworld

下载文件为一个apk文件,用ApkIDE打开,查找main函数,发现flag
answer

18. reverse3

PE查壳,无壳,且为32为程序
IDA32位打开,找main函数,看反汇编有点麻烦,F5查看伪C代码,查看到关键位置
tap1
进入sub_4110BE函数,精确发现讯在大量的2,4移位,自己了解过base64加密解密,可得知其为类似base64加密,点击黄色区域查看base64表为ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
其中Str2e3nifIH9b_C@n@dH已知,for循环将字符串还原,还原后直接在线转换
tap2

p = ""
s = "e3nifIH9b_C@n@dH"
for i in range(len(s)):
    p += chr(ord(s[i]) - i)
print(p)

answer

19. 不一样的flag

下载文件打开,出现下图左侧结果,让我们输入,拖入IDA,伪代码显示如下右侧,简单分析
tap1
从以下25的字符串长度,以及移位4,1的特性,可简单绘制5X5的格子,*表示推箱人,#表示出口,1表示墙,由图可简单发现一条出路,按照路径进行推动,222441144222即为flag

m = "*11110100001010000101111#"
print(len(m))  # 25
'''
    * 1 1 1 1
    0 1 0 0 0
    0 1 0 1 0
    0 0 0 1 0
    1 1 1 1 #
'''

20. SimpleRev

这题有点意思,其在强制转换时考虑到了小端序存储等知识点
小端存序储示例:

存储12345678
按照字节存储(char): 12 34 56 78
按照字存储(word):34 12 78 56
按照双字存储(dword):78 56 34 12

进入题目,IDAF5伪代码,进入关键函数Decry(),关键步骤如下
tap1
tap2
红色方框发现其强制转换了,则小端序存储读其内存时就会发生错误,即上面所注释就不正确,这里还以 存储12345678 为例

  • 当从dword强转为char时,由于存储方式并没有改变,读取方式发生了改变,原来是小端序4字节读取,现今变为小端序1字节读取,所以此时text拼接,应将后面v9倒序,即 text = killshadow
  • 同理,倒过来依旧成立,数组在计算机的存储是按照其数据类型依次存储的,学过编程语言的应该都了解。char类型存储方式未改变,以dword的4字节方式来读取,再次将后面src倒序,即 key = ADSFKNDCLS

根据以上分析将key转为小写,Str2=textv1即可

key = 'adsfkndcls'
text = str2 = 'killshadow'
flag = ''
# 方法一,此方法更容易理解
for i in range(len(key)):
    for j in range(65, 122):
        if ord(text[i]) == (j - 39 - ord(key[i % 10]) + 97) % 26 + 97:
            flag += chr(j)
            break
print(flag)
# 方法二
for i in range(len(str2)):
    for j in range(10):
        m = ord(str2[i]) - 97 + 26 * j - 97 + 39 + ord(key[i])
        if (m > 64) & (m < 91):
            flag += chr(m)
            break
print(flag)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值