CTF Show Reverse - 【re2】 ~ RC4流密码加密

感谢@W22提供的题目

1、解压运行

解压打开有两个文件,打开enflag.txt,发现是乱码

用010重新打开,猜测可能是会用到十六进制

运行一下勒索病毒.exe,输入即闪退

2、ida分析

用PEiD查了下壳,没有壳,直接拖入ida中,sub_401037点进去一看应该是个format格式化类似功能的函数,sub_401073函数看一下给的参数和下面对v10的判断,可以推断是个输入函数,改名成scanf,下面就是对两个文件读取,不存在则退出

2.1 str异或

sub_401069函数,看参数就感觉不简单,有点可疑,点进去以后返回sub_401A70函数的返回值,继续步入,可以看到对Str进行逐位异或,得到Str1,然后和给定的字符串进行比较,成功返回

这个地方插一句,根据if-else语句可以推断format应该是print输出的功能,重命名为print

先写个脚本,异或回来,这里异或的是0x1f,再异或一次,就可以得到原始的Str,也就是输入的内容,定死了,就是[Warnning]Access_Unauthorized

str = "DH~mqqvqxB^||zll@Jq~jkwpmvez{"
flag = ""
for s in str:
    flag += chr(ord(s) ^ 31)
print(flag)

# [Warnning]Access_Unauthorized

2.2 sub_4014E0函数

接下来步入下一个函数sub_401028,可以看到传入了5个参数,然后返回sub_4014E0函数返回值

可以简单看一下,取了str的长度,通过4个函数的操作,最后close了flag和enflag两个文件指针

2.2.1 sub_4010F0函数

返回sub_401800函数返回值,继续步入,先根据上一个函数传入的参数重命名一下

转换成python代码为:

def get_result(a2, str, len):
    result = 0
    if len <= 256:
        for i in range(256):
            a2[i] = str[i % len]
            result = i + 1

    if len > 256:
        for j in range(256):
            a2[j] = str[j]
            result = j + 1
    return result

2.2.2 sub_4010C8函数

这个函数主要是针对a3进行操作,返回sub_401780函数返回值,重命名一下

转换成python代码:

def init_a3(a3):
    result = 0
    for i in range(256):
        a3[i] = i
        result = i + 1
    return result

2.2.3 sub_40116D函数

返回sub_4018E0函数返回值,简单重命名一下

转为Python代码:

def replace(a3, a2):
    key, result = 0, 0
    for i in range(256):
        key = (a2[i] + key + a3[i]) % 256
        tmp = a3[i]
        a3[i] = a3[key]
        a3[key] = tmp
        result = i+1
    return result

2.2.4 sub_4010EB函数

返回sub_4015E0函数返回值,简单重命名一下,这个地方主要是处理了以后输出

转换成python代码:

def write(a3, in_file, out_file):
    v6, v7, result = 0, 0, 0
    i = in_file.read(1)
    while i != "":
        result = ord(i)
        if result == -1:
            break

        v7 = (v7 + 1) % 256
        v6 = (v6 + a3[v7]) % 256
        v4 = a3[v7]
        a3[v7] = a3[v6]
        a3[v6] = v4

        xor_value = a3[(a3[v6] + a3[v7]) % 256] ^ result
        out_file.write(chr(xor_value))

        i = in_file.read(1)

    return result

整合一下,然后进行代码重构,得到完整的代码:

def init(a3, key, len_key):
    if len_key <= 256:
        for i in range(256):
            a2[i] = key[i % len_key]
            a3[i] = i
    # else:  # 输入的key固定,长度不超过256
    #     for j in range(256):
    #         a2[j] = key[j]
    #         a3[j] = j

    k = 0
    for i in range(256):
        k = (a2[i] + k + a3[i]) % 256
        tmp = a3[i]
        a3[i] = a3[k]
        a3[k] = tmp


def write(a3, data):
    i, j, result = 0, 0, 0
    for k in range(len(data)):
        i = (i + 1) % 256
        j = (j + a3[i]) % 256
        tmp = a3[i]
        a3[i] = a3[j]
        a3[j] = tmp

        t = (a3[j] + a3[i]) % 256
        data[k] = data[k] ^ a3[t]


if __name__ == '__main__':
    key = b"[Warnning]Access_Unauthorized"
    len_key = len(key)
    a2, a3 = [0]*256, [0]*256
    init(a3, key, len_key)

    data = bytearray([
        0xC3, 0x82, 0xA3, 0x25, 0xF6, 0x4C, 0x36, 0x3B, 0x59, 0xCC, 0xC4, 0xE9,
        0xF1, 0xB5, 0x32, 0x18, 0xB1, 0x96, 0xAE, 0xBF, 0x08, 0x35
    ])
    write(a3, data)
    for i in data:
        print(chr(i), end="")

看了下有个大佬的代码更加精简:https://www.cnblogs.com/sk2rw/p/15091304.html#

key3 = [0xC3, 0x82, 0xA3, 0x25, 0xF6, 0x4C, 0x36, 0x3B, 0x59, 0xCC, 0xC4, 0xE9, 0xF1, 0xB5, 0x32, 0x18, 0xB1, 0x96, 0xAE, 0xBF, 0x08, 0x355]

c = key3
t = []
key = '[Warnning]Access_Unauthorized'
ch = ''
j = 0  # 初始化
s = list(range(256))  # 创建有序列表
for i in range(256):
    j = (j + s[i] + ord(key[i % len(key)])) % 256
    s[i], s[j] = s[j], s[i]
i = 0  # 初始化
j = 0  # 初始化
for r in c:
    i = (i + 1) % 256
    j = (j + s[i]) % 256
    s[i], s[j] = s[j], s[i]
    x = (s[i] + (s[j] % 256)) % 256
    ch += chr(r ^ s[x])
print(ch)

还有一种更简单一点的解法,就是把enflag.txt重命名为flag.txt,因为对flag.txt是读,要求文件必须存在,而对enflag.txt是写,不要求必须存在,不存在会自动创建

然后整个程序的功能就是从flag.txt中读入flag字符串,然后做一个异或检测一下,然后进行某种加密得到enflag,再写入enflag.txt

最后在enflag.txt文件中就可以得到flag,但是对具体的加密并不是很了解,且若不是对称加密,也并不能依靠这种方法进行解密

可以参考这篇博客[ctf.show.reverse] re2_ctfshow reverse re2-CSDN博客

最终flag为:

flag{RC4&->ENc0d3F1le}

https://www.cnblogs.com/sk2rw/p/15091304.html#

[ctf.show.reverse] re2_ctfshow reverse re2-CSDN博客

https://blog.51cto.com/u_15127693/3946413


看了下flag,又去找了找RC4加密

RC4是流密码,生成伪随机比特流(密钥流)。与任何流密码一样,它们可以通过使用按位异或将其与明文组合来用于加密;解密以相同的方式执行(因为互斥或给定数据是对合)。这与一次性填充类似,只是使用生成的伪随机位而不是准备好的流

RC4加密的特点

如果输入的是明文,输出的就是密文;如果输入的是密文,输出的就是明文

RC4的工作原理

加密程序
  1. 用户输入纯文本文件和密钥。
  2. 然后加密引擎使用 KSA 和 PRGA 算法生成密钥流。
  3. 现在,该密钥流与纯文本进行异或,该异或运算是逐字节完成的,以生成加密文本。
  4. 然后将加密的文本发送给预期的接收者,预期的接收者将解密该文本,解密后,接收者将得到原始的明文。
解密程序

解密是通过对密文执行相同的字节异或运算来实现的。 

示例:设 A 为纯文本,B 为密钥流 (A xor B) xor B = A 

What is RC4 Encryption? - GeeksforGeeks

https://zh.wikipedia.org/wiki/RC4

1 Nowhere (feat. Gervs) Shaker / COBRA / Gervs
2 Bubble STAYC
3 어푸 IU
4 花日 CMJ
5 If We're Being Honest Novo Amor
6 春色悠悠不及你荡漾 陈婧霏
7 足够 银河快递
8 Satisfaction KSHMR
9 April 伍嘉成
10 Alone Shaker
11 happy for you Alex Porat
12 I Feel Better Novo Amor
13 Normal No More TYSM
14 Bubble Gum noli
15 だから僕は音楽を辞めた 他城 / 鏡音リン
16 银河流浪 打扰一下乐团
17 I GOT YOU TWICE
18 Welcome to the Show DAY6
19 有你的快乐 王若琳
20 Run For Roses NMIXX
21 내 손을 잡아 IU
22 玫瑰往事 陶薏点
23 안녕,네버랜드 (Bye My Neverland) KISS OF LIFE
24 人生是旷野 苏运莹 / Kui Kui
25 来吧,占领我的无私 银河快递
26 One Minute Hauskey / Hope Tala
27 FREAK YU琦
28 봄눈(Spring Snow春雪)-背着善宰跑ost 初九
29 Teddy Bear STAYC
30 The Kids Are All Dying FINNEAS
31 Tell Me It's Not a Dream (Eng ver.) 10cm
32 Hey KONG KEY.L刘聪 / c0de731
33 청혼 金秀贤
34 일기 金娜英
35 泪桥(AI杨丞琳) AI小妖


안녕,네버랜드 (Bye My Neverland) - KISS OF LIFE
01:11 / 03:23   
   
An audio error has occurred, player will skip forward in 2 seconds.
作词 : Ondine, 진솔, Strawberrybananaclub, Julie
作曲 : 진솔, Ondine, Strawberrybananaclub, Julie, Haneul
Going round and round (不停地转啊转啊)
저태엽을더감지않아 (直到我的发条再也拧不动了)
오르골은닫고전부치워 (关上八音盒 全部丢掉吧)
Feel like Im an old toy (感觉我就像一个坏掉的玩具)
더자라지않는내흉터 (我的伤痕没有再变得更大)
아플바엔잊혀지려했어Wait (与其痛苦 不如忘却 等等)
Why am I afraid Oh Why (为什么我会害怕 为什么啊)
Got me feeling it yeah (让我感受到了它)
벽장속에든상처 (藏在壁橱里的伤口)
먼지쌓인밤 (灰尘堆积的夜晚)
난더숨고싶거나 (我更想躲起来 或是)
감추지않아 (再也不去隐藏)
Dont wanna stay more (不想再停滞不前了)
I dont care what you say (我不在乎你说的是什么)
I burned my neverland (我烧毁了我的梦幻岛)
시계위로 달려 장면을넘겨 (时过境迁 画面闪过)
멈추고싶지않아 (我不想停下来)
Yeah We dont care what you say (是的 我们不在乎你说什么)
I burned my neverland (我烧毁了我的梦幻岛)
돌아보지 않아 긴밤을지나 (不回头 漫漫长夜过去)
후회따윈없어 (没有丝毫悔意)
Ill never comeback (我永远不会回头)
Leave the hometown (离开了家乡)
Different somehow (不知怎的 有些不同)
멈췄던일기속을Fix it (在停下来的日记中 修复好它)
겁많던아이뒤에사라진꿈 (消失在曾经那个胆小的孩子身后的梦想)
눈감지마Now I can make it new (不要闭眼 现在我可以让一切焕然一新)
No more regrets (不再后悔)
Im tryna play a fair game (我只是想要公平竞争)
내벽지위로변치않던아픔의키를재 (在我的墙纸上测量着从未改变的令人痛苦的身高)
두려웠던Yesterday (曾害怕过的昨天)
Dont recall it passed away (不要回忆了 它已经逝去)
My fairy tale wont be beautiful as starlight (我的童话不会像星光一样美丽)
벽장속에든상처 (藏在壁橱里的伤口)
먼지쌓인밤 (灰尘堆积的夜晚)
난더숨고싶거나 (我更想躲起来 或是)
감추지않아 (再也不去隐藏)
Dont wanna stay more (不想再停滞不前了)
I dont care what you say (我不在乎你说的是什么)
I burned my neverland (我烧毁了我的梦幻岛)
시계위로 달려 장면을넘겨 (时过境迁 画面闪过)
멈추고싶지않아 (我不想停下来)
Yeah We dont care what you say (是的 我们不在乎你说什么)
I burned my neverland (我烧毁了我的梦幻岛)
돌아보지 않아 긴밤을지나 (不回头 漫漫长夜过去)
후회따윈없어 (没有丝毫悔意)
Ill never comeback (我永远不会回头)
And they all lived happily ever after (在那之后他们都过得很幸福)
그딴건없어 (没有那样的事)
뻔한행복을바라지는않아 (我不奢望显而易见的幸福)
So I wont stop my time (所以我不会让我的时间停下来)
아파도자라고싶어난 (即使疼痛 我也想要长大)
I get a little bit lonely (我变得有点孤独)
어른이돼 Now now now now (长大成人 就是现在)
I dont care what you say (我不在乎你说的是什么)
I'm gonna take a train (我要乘火车远行)
비어버린 Playground 나의모래성 (空荡荡的游乐场 我的沙堡)
두고가려해Bye bye (被我留在了身后 再见吧)
Yeah We dont care what you say (是的 我们不在乎你说什么)
I burned my neverland (我烧毁了我的梦幻岛)
이제정말떠나 긴밤을지나 (现在真的要离开 度过漫漫长夜)
후회따윈없어 (没有丝毫悔意)
Ill never comeback (我永远不会回头)
Im leaving my hometown (我要离开我的家乡了)
Why is it sad I dont know (为什么 这很悲伤吗 我不知道)
La la Finally its over (啦 啦 最终一切结束了)
인사를 건네 (我作个告别)
Im leaving my hometown (我要离开我的家乡了)
Why is it sad I dont know (为什么 这很悲伤吗 我不知道)
La la Finally its over (啦 啦 最终一切结束了)
Im sorry (我很抱歉)

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CTF ReverseCTF逆向)是一种在CTF竞赛中涉及到的题目类型,要求参赛选手具备较强的反汇编和反编译技术,并能够进行逆向分析。逆向分析与功能猜测结合,通过逆向分析缩小猜测范围,然后通过逆向验证猜测的思路。 在实际的CTF Reverse练习中,参赛选手可以通过访问特定网页或平台来进行实验和练习。例如,可以尝试进入实验网页[CTF- REVERSE练习之逆向初探](https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014111410002900001&pk_campaign=freebuf- wemedia)来进行逆向初步探索。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CTF逆向(reverse)入门脑图](https://download.csdn.net/download/qq_32465127/10744933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【完善中】CTF逆向Reverse题的玩法](https://blog.csdn.net/m0_37157335/article/details/123694868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [CTF-REVERSE练习之逆向初探](https://blog.csdn.net/text202202/article/details/129824733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值