吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5218|回复: 10
收起左侧

[CTF] 关于某ctf比赛一道逆向题的简单分析

[复制链接]
姚小宝 发表于 2018-9-4 20:31
本帖最后由 yechen123 于 2018-9-4 20:38 编辑

具体是哪个比赛我也不懂 随便哪来分析的

具体附件先上传 re1.zip (15.02 KB, 下载次数: 33)

先用exeinfope查壳  

1.png

无壳 直接上IDA分析

3.png

具体流程还是很清晰的

4.png
先要求用户输入字符串
最后再在字符串末尾置0


5.png
然后在进入第一个加密的循环
这个循环总体思路是不断改变字符串里面的字符的位置
if(j&1)..else这个判断具体是 如果j为单数就执行if里面的语句 否则执行else里面的语句

最后一个加密
6.png
如果字符的ascci码 +13 < 61 则字符^0x34 否则^0x37
对于这段代码 可以这样子解密
[Asm] 纯文本查看 复制代码
        if ((flags[i]^0x34) + 13) < 61:
                flags[i] = flags[i]^0x34
        else:
                flags[i] = flags[i]^0x37


最后加密字符再跟程序里面字符比较

7.png


也就是说  取出存在程序里面的字符再逆着写脚本就可以得到真正的flag
最后直接上脚本
[Asm] 纯文本查看 复制代码
flagde = '00 71 04 03 68 50 52 5B 68 07 5F 02 45 68 40 5E 59'
flags = flagde.split(' ')

for i in range(len(flags)):
        flags[i] = int(flags[i], 16)

i = len(flags) - 1


while i>=0:
        if ((flags[i]^0x34) + 13) < 61:
                flags[i] = flags[i]^0x34
        else:
                flags[i] = flags[i]^0x37
        i -= 1


v5 = len(flags) - 1
j = v5
while j>0:
        if j&1:
                v7 = v5 - (v5 % j)
                v8 = v7
                count = 0
                k = ''

                while v8>j:
                        v8 -= j
                        count += 1

                k = flags[j]

                while count!=0:
                        v8 += j
                        flags[v8-j] = flags[v8]

                        count -= 1

                flags[v7] = k


        else:
                v10 = j
                count = 1
                v9 = flags[v10]
                if (2*j <= v5):
                        v10 += j
                        while j + v10 <= v5:
                                v10 += j
                                count += 1
                        v9 = flags[v10]

                        while count != 0:
                                v10 -= j
                                flags[j + v10] = flags[v10]
                                count -= 1
                flags[j] = v9

        j -= 1

print (flags)
flag = ''
for i in range(1,len(flags)):
        flag += chr(flags[i])

print (flag)


2.png

免费评分

参与人数 2威望 +1 吾爱币 +11 热心值 +2 收起 理由
无闻无问 + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

天使3号 发表于 2018-9-5 14:28
Good Job!Thank you.
无闻无问 发表于 2018-9-5 19:48
jmpengbo 发表于 2018-9-5 22:46
zhangzc 发表于 2018-9-6 09:26
感谢楼主分享!
下过来粗略的试了一下,有问题想求教一下
QQ截图20180906091921.jpg
这是我用IDA7.0里看到byte_407030
和你python代码里输入的flagde = '00 71 04 03 68 50 52 5B 68 07 5F 02 45 68 40 5E 59'不完全一样
请问你这个flagde是怎么得出的?
橙D.秀 发表于 2018-9-6 14:14
看成CF.........
 楼主| 姚小宝 发表于 2018-9-6 20:30
zhangzc 发表于 2018-9-6 09:26
感谢楼主分享!
下过来粗略的试了一下,有问题想求教一下

今天课有点多没来的及回复
首先回答为什么第一位是00的问题 因为在ida和od中  一开始比较从用下标为1的字符开始移位和加密的
而 第一层加密if(j&1)..else那里 是单数执行if 复数执行else的 为了不搞混解密 我下标为0的时候填00  最后输出的时候不输出那一位就行

对于是40还是43的问题  如果我填的是43的话 得到的flag是er3h_t0n_5i_g4lF  也就是flag is not here 明显不是flag  然后使用od跟踪的话 发现er3h_t0n_5i_g4lF 在最后的比较中 加密后的字符串得到的是40而不是43  而程序中是43  所以40和43不一样 不能解密  
前面也说过了  第一层加密 也就是if(j&1)..else 只是移位  并没有 改变字符
改变字符的是第二层加密
总之我们要让最后经过加密的字符串为43而不是40
如果我们填40解密出来的字符串在经过加密就是43 如果填43经过解密出来的字符串再经过加密就是40  所以得填40  这应该是出题人的一个诡计
这个我有点难解释  你用od跟踪一下应该很快就会明白了
emmmm  第一次写解题思路 写的不是很好 望见谅
zhangzc 发表于 2018-9-20 14:11
yechen123 发表于 2018-9-6 20:30
今天课有点多没来的及回复
首先回答为什么第一位是00的问题 因为在ida和od中  一开始比较从用下标为1的 ...

非常感谢!原来还有这样的操作
最近没上论坛,刚刚才看到。
52lxw 发表于 2018-9-22 14:09
学习了,哈哈哈哈
52896009 发表于 2018-10-9 17:19
看了之后想放弃的感觉。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 23:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表