首页 > 其他分享 >攻防世界乱刷

攻防世界乱刷

时间:2024-03-22 12:32:26浏览次数:22  
标签:攻防 base64 题目 乱刷 res 左移 世界 跳转 平坦

攻防世界乱刷

题目

题目地址:polyre

  1. 拿到题目后无壳,直接拖入ida反汇编,从start函数直接跳到main函数:
  2. 明显的虚假控制流平坦化,这里简单讲一下什么是平坦化,平坦化就是将原本嵌套多层的语句,改为只用1个switch加while循环来实现,下面使用python语句来表现一个循环语句平坦化:
#原程序
res=[1,-1,2,-2,3,-3]
for i in range(len(res)):
    if res[i] < 0:
        res[i]<<=1
        res[i]+=10
        if res[1]&1==1:
            res[i]*=2
    else :
        res[i]^=13
        res[i]*=4
        # if res[1]
print(res)

res=[1,-1,2,-2,3,-3]
#手动添加平坦换后
i=0
while i<len(res):
    b=(int(res[i]<0)^1)+1
    while True:
        match b:
            case 0:
                break
            case 1:
                res[i]<<=1
                b=3
                
            case 2:
                res[i]^=13
                b=4
                
            case 3:
                res[i]+=10
                b=(res[i]&1)*5
                
            case 4:
                res[i]*=4
                break
                
            case 5:
                res[i]*=2
                break
    i+=1
print(res)


4. 其实现的功能仍然是一样的,只不过将一个循环里的多个语句放在了不同的子模块中,再通过子模块之间的相互控制,来达到原有程序的效果。详细的平坦换请看下面这篇文章:控制流平坦化
5. 知道控制流平坦化后,可以使用符号化执行来简化程序,使程序的可读性增强,便于反汇编,使用deflat.py脚本即可去除平坦化:命令如下
6. -f后是文件名,–addr后是要平坦化的函数首地址,执行后效果如下:汇编视图
7. 这里可以看到,去平坦化后的程序刻度性增强,不过其中还有一些出题人塞进去的虚假指令(恒真/假),永远不会执行。
8. 例如:第一个if语句后面的 ((((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054) & 1) != 0条件就永远为假**(n*(n-1))&1这个结果恒等于0,所以前面的条件恒假,即if语句里面的程序根本不会执行,类似的虚指令后面还有16个,需要清除:
9. 这里使用idapython脚本来快速去除,这里
脚本的逻辑**:将jnz指令的条件跳转修改为直接跳转,因为后面的jmp语句永远不会执行,后面的while循环同理,只会执行一次,因此利用脚本将jnz的条件跳转直接改为jmp进行直接跳转(顺跳),源程序相当于:

st = 0x0000000000400620 #main开始
end = 0x0000000000402144 #main结束
 
def patch_nop(start,end):
    for i in range(start,end):
        ida_bytes.patch_byte(i, 0x90)		#修改指定地址处的指令  0x90是最简单的1字节nop
 
def next_instr(addr):
    return addr+idc.get_item_size(addr)		#获取指令或数据长度,这个函数的作用就是去往下一条指令
    
 
 
addr = st
while(addr<end):
    next = next_instr(addr)
    if "ds:dword_603054" in GetDisasm(addr):	#GetDisasm(addr)得到addr的反汇编语句
        while(True):
            addr = next
            next = next_instr(addr)
            if "jnz" in GetDisasm(addr):
                dest = idc.get_operand_value(addr, 0)		#得到操作数,就是指令后的数
                ida_bytes.patch_byte(addr, 0xe9)     #0xe9 jmp后面的四个字节是偏移
                ida_bytes.patch_byte(addr+5, 0x90)   #nop第五个字节
                offset = dest - (addr + 5)  #调整为正确的偏移地址 也就是相对偏移地址 - 当前指令后的地址
                ida_bytes.patch_dword(addr + 1, offset) #把地址赋值给jmp后
                print("patch bcf: 0x%x"%addr)
                addr = next
                break
    else:
        addr = next
  1. 利用脚本修改后的汇编指令,反编译程序如下,去除掉后面16个虚指令:
  2. 前期准备结束,正式开始分析函数实现的功能,第一个循环的逻辑是将最后输入的回车符"\n"转化为0,第二个循环:将输入的字符串每8个一组(共64个bit)进行一下处理,大于零则左移1位(乘2),小于零则左移1位后与0xB0004B7679FA26B3异或。这里由于变量v4是64位的有符号数,左移根据其最高位来判定符号,1为负数,0为正数:
  3. 最后,Jami后的字符串与程序给定的数据相比较,因为8个字节一组,所以将程序给定的48个字节分为6组整合到一起:
  4. 最后解密脚本如下,脚本里面使用到的逻辑:原先的正数(最高位的符号位为0)左移1后一定是偶数(左移后低位自动用0补充),而原先的负数(最高位的符号位为1)左移1后(变为偶数)再与0xB0004B7679FA26B3(奇数)异或,结果一定是奇数,也就是说,最后结果(加密一次)里面的偶数原先一定是正数,而结果里面的奇数原先一定是负数,所以根据每次结果奇偶性即可判定上一次该值是否为正或者负,如果是负数则需要给最高位(第64为)补上1(补上因为加密是左移而溢出的1),为正数不用补(加密是左移溢出的是0,相当于没有溢出):
a=[0xBC8FF26D43536296,0x520100780530EE16,0x4DC0B5EA935F08EC,0x342B90AFD853F450,
0x8B250EBCAA2C3681,0x55759F81A2C68AE4]
key=0xB0004B7679FA26B3
for res in a:
    for j in range(64): #循环64次
        tmp=res&1
        if tmp == 1:#判定是否为奇数(为奇数则上轮加密是为负数),在二进制下最低为为1则是奇数
            res ^= key
        res>>=1
        if tmp==1:
            res+=0x8000000000000000 #如果该次加密前是负数(),把左移漏掉的最高位1补回来

    #输出,大小端续转化输出
    k=0
    while k<8:
        print(chr(res&0xff),end="")
        res>>=8
        k+=1
#flag{6ff29390-6c20-4c56-ba70-a95758e3d1f8}

总结:控制流平坦换的题需要将程序还原,增强程序的可读性,程序中存在永真(或永假)指令时可以利用idapython将条件跳转(jz,jnz)修改为直接跳转(jmp),进一步增强可读性。

题目 :maze

题目地址 :maze

  1. 查壳无,直接使用ida打开,这应该时一道迷宫的题,打开后如下。在这里插入图片描述
  2. 分析,发现这是一道直线迷宫的题,解这类题目只需要找到该直线迷宫,分析键盘输入对应的移动操作即可,迷宫如下:
  3. 在主循环中分析输入的flag对应的移动操作,可以看到0 后退1=79,前进1=111,后退8=46,前进8=48,由cmp函数可以看见只能停留在空格#
  4. 分析出输入对应的移动操作后,即可走完迷宫,操作对应如下,代码附上:
'  *******   *  **** * ****  * ***  *#  *** *** ***     *********'
# 0 后退1=79
# 1 前进1=111
# 2 后退8=46
# 3 前进8=48
key=[79,111,46,48]
#    0 , 1 , 2,3
res=[1,3,1,1,3,3,0,3,3,3,1,1,1,1,2,2,0,0]
for i in range(len(res)):
    print(chr(key[res[i]]),end="")
flag="o0oo00O000oooo..OO"
print(len(flag))

最后flag=nctf{o0oo00O000oooo…OO}

题目:easy_go

题目地址:easy_go

  1. 无壳,直接ida打开:=
  2. 能看到的关键信息由一个字符串 “tGRBtXMZgD6ZhalBtCUTgWgZfnkTgqoNsnAVsmUYsGtCt9pEtDEYsql3”,外加一个encode_base64的加密函数,看到了base64直接去找base64表,字符串里面直接看,搜索abcdefgABCDEFG…,查询base64表:
  3. 其中发现三个比较像的字符串,三个字符串一个一个用脚本(网站)试一下,最后真正的base64表是6789_-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345
  4. 总结:有关于base64的题目都可以直接去找base64表和密文。

题目:polyre

题目地址:polyre

标签:攻防,base64,题目,乱刷,res,左移,世界,跳转,平坦
From: https://blog.csdn.net/yjh_fnu_ltn/article/details/136909631

相关文章

  • 芯片科技:从微观世界到现实应用的奇妙之旅
    引言:在当今数字化时代,芯片是现代科技发展的基石之一,几乎每个人都在日常生活中使用着芯片技术。无论是智能手机、电脑、汽车,还是家用电器,都离不开芯片的支持。本文将带您深入了解芯片的本质、制造工艺以及广泛应用的领域,以通俗易懂的方式揭示芯片背后的科学奥秘和技术挑战。......
  • 魔兽世界LUA插件开发与示例
    魔兽世界LUA插件开发1.创建插件1.1创建插件文件夹打开WorldofWarcraft\Interface\AddOns文件下,在该文件夹下创建一个插件名文件夹用来存放插件,如Makubex1.2创建插件文件在该文件夹下创建俩个文件,一个是用来给魔兽世界引入的toc头文件,一个是你自己的lua脚本文......
  • 31.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-其它消息的实现与使用优化
    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!如果看不懂、不知道现在做的什么,那就跟着做完看效果内容参考于:易道云信息技术研究院VIP课上一个内容:30.数据搜索功能码云地址(master分支):https://gitee.com/dye_your_fingers/titan码云版本号:6cd3ae3d3bf803e1......
  • 探秘电路世界的魔法!解析电路仿真软件的奥秘与神奇功能
    在当今电子科技高速发展的时代,电路设计已经成为了许多领域的重要组成部分。而在电路设计的过程中,电路仿真软件无疑是不可或缺的工具之一。今天,让我们一起来揭开电路仿真软件的神秘面纱,探索其中的奥秘与神奇功能!了解电路仿真软件的基本原理和功能电路仿真软件是通过数学模型......
  • RSA算法揭秘:加密世界的守护者
    RSA算法起源:RSA算法是由RonRivest、AdiShamir和LeonardAdleman在1977年共同提出的。它是一种非对称加密算法,基于两个大素数的乘积难以分解的数论问题。RSA算法包括公钥和私钥,用于加密和解密数据,实现了安全的通信和数据传输。首页|一个覆盖广泛主题工具的高效在线平台(a......
  • LLMR:使用大型语言模型实时提示交互式世界
    混合现实的大型语言模型(LLMR),这是一个用于LLMs实时创建和修改交互式混合现实体验的框架。LLMR利用新颖的策略来解决理想的训练数据稀缺的困难情况,或者设计目标需要综合内部动态、直观分析或高级交互性的情况。我们的框架依赖于文本交互和Unity游戏引擎。通过结合场景理解、......
  • LAMP 世界上使用最广泛的框架(安装LAMP框架)快照
    说是框架就不只是一个东西。L:Linux,一种操作系统类型,专为服务器领域服务.A:Apache,web服务器。    M:MySQL,数据库,存储项目的元数据,真实数据会存放在硬盘中。P:PHP,一种编程语言,专注在web领域。LAMP取各软件首字母,组合而成,并且都有一些共同的特性,比如开源、免......
  • 攻防实战 | 记一次nacos到接管阿里云&百万数据泄露
    在某次攻防当中,通过打点发现了一台nacos,经过测试之后发现可以通过弱口令进入到后台,可以查看其中的配置信息通过翻看配置文件,发现腾讯云的AK,SK泄露,以及数据库的账号密码。操作不就来了么,直接上云!利用CF工具加上之前的AK,SK配置信息,创建腾讯云控制台账号密码,登录后直接上云......
  • 三维地理信息平台:构建现实世界的数字孪生
    三维地理信息平台:构建现实世界的数字孪生随着信息技术的飞速发展,人们对地理信息的需求日益增长。传统的二维地图已不能满足复杂、多维度的空间信息展示和分析需求。因此,三维地理信息平台应运而生,成为地理信息科学领域的研究热点和应用前沿。本文将从三维地理信息平台的概念、......
  • 程序人生——Java开发持续进阶,拥抱开源世界以思想为源泉
    目录引出开源世界建议139:大胆采用开源工具建议140:推荐使用Guava扩展工具包建议141:Apache扩展包建议142:推荐使用Joda日期时间扩展包建议143:可以选择多种Collections扩展思想为源建议144:提倡良好的代码风格建议145:不要完全依靠单元测试来发现问题建议146:让注释正确、清......