攻防世界逆向刷题

阅读须知:

探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者
本人负责,作者不为此承担任何责任,如有侵权烦请告知,我们会立即删除并致歉,创作不易转载请标明出处.感谢!

波克比QWQ师傅

原文出处: https://blog.csdn.net/yjh_fnu_ltn?type=blog

题目

题目地址: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]<<=1res[i]+=10if res[1]&1==1:res[i]*=2else :res[i]^=13res[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)+1while True:match b:case 0:breakcase 1:res[i]<<=1b=3case 2:res[i]^=13b=4case 3:res[i]+=10b=(res[i]&1)*5case 4:res[i]*=4breakcase 5:res[i]*=2breaki+=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字节nopdef 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 = nextnext = 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 = nextbreakelse: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&1if tmp == 1:#判定是否为奇数(为奇数则上轮加密是为负数),在二进制下最低为为1则是奇数res ^= keyres>>=1if tmp==1:res+=0x8000000000000000 #如果该次加密前是负数(),把左移漏掉的最高位1补回来#输出,大小端续转化输出k=0while k<8:print(chr(res&0xff),end="")res>>=8k+=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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用`scipy.stats.wasserstein_distance`来计算两个一维分布之间的Earth Mover‘s Distance (EMD)距离

在Python中&#xff0c;计算Earth Mover’s Distance (EMD)通常使用scipy库中的scipy.stats.wasserstein_distance函数&#xff0c;该函数计算的是Wasserstein距离&#xff0c;它与EMD非常相似&#xff0c;都是用来衡量两个分布之间的距离。 以下是一个简单的Python程序例子&a…

超好用的快捷回复软件

随着直播经济和短视频平台的兴起&#xff0c;品牌营销阵地不再局限于传统的电商巨头——淘宝、天猫、京东和拼多多&#xff0c;越来越多的品牌正积极布局快手、抖音等新晋电商平台&#xff0c;同步打造社群矩阵以拓宽产品推广渠道。这种多维度的市场渗透策略有力地提升了品牌的…

C语言看完我这篇编译与链接就够啦!!!

1. 前言 Hello&#xff01;大家好我是小陈&#xff0c;今天来给大家介绍最详细的C语言编译与链接。 2. 编译和链接 我们通常用的编译器&#xff0c;比如Visual Sudio,这样的IDE(集成开发环境&#xff09;一般将编译和链接的过程一步完成&#xff0c;通常将这这种编译和链接合…

算法(6)KMP+trie

KMP&#xff1a; 最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili 该视频使用python书写代码&#xff0c;不会python的小伙伴也可以看看了解kmp的大致思路。 问题描述&#xff1a; kmp&#xff1a;字符串匹配算法&#xff0c;用来找一个长字符串中出现了几次小字符串&#xf…

【机器学习300问】54、如何找到有效的组合特征?

一、为什么需要去寻找有效的组合特征&#xff1f; 因为并不是所有的特征组合都会意义&#xff0c;都能带来价值。 例如在房价预测场景中&#xff0c;卧室数量和浴室数量的比值有意义&#xff0c;但房屋面积与建造年份相组合作为新的组合特征&#xff0c;可能就没有实际含义&…

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试 1 Prerequisites1.1 C11 or C0x Compiler1.2 Pangolin1.3 OpenCV1.4 Eigen3 2 安装 Intel RealSense™ SDK 2.02.1 测试设备2.2 编译源码安装 (Recommend)2.3 预编译包安装 3 编译 ORB-S…

PTA L2-037 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&#x…

07、Lua 流程控制

Lua 流程控制 Lua 流程控制控制结构语句 Lua 流程控制 Lua编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码&#xff0c;在条件为 false 时执行其他指定代码。 以下是典型的流程控制流程图&#xff1a; 控制结构的条件表达式结…

vscode c++环境配置

1.基础软件安装 安装Visual Studio Code. 安装C拓展。点击在vscode界面最左侧的Extensions图标&#xff08;打开快捷键&#xff1a;ctrlshiftX&#xff09;&#xff0c;搜索“C/C”&#xff0c;点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下…

查立得源码如何去除版权

最近发现很多人百度&#xff1a;查立得源码如何去除版权。 每个源代码/软件都是有版权的&#xff0c;无法去除&#xff0c;我们也得尊重知识产权/劳动成果。 可以去除/修改的是&#xff1a;页面显示的版权信息,查立得底部信息均可自定义(一般conn.php可修改)。 另&#xff1…

Linux-2 Linux的权限

目录 1.什么是权限&#xff1f; 2.权限的本质 3.Linux中的用户 普通用户与root用户相互转换 普通用户不变root&#xff0c;以root身份执行一个命令 LInux中的角色 4.Linux文件的权限 5.快速掌握修改权限的做法 修改权限 6.对比权限有无表现 对于普通用户&#xf…

五分钟,零基础也能入门 Python 图像文字识别

一. 前言 最近在研究 Python 的一些功能 &#xff0c; 也尝试了一些有趣实现&#xff0c; 这一篇就从实践的角度来研究一下 Python 如何实现图片识别。 众所周知 &#xff0c; Python 的库真的老多了&#xff0c;其中在图像识别上比较突出的就是 OpenCV. 那么基于这个库我们…

基于RAG的大模型知识库搭建

什么是RAG RAG(Retrieval Augmented Generation)&#xff0c;即检索增强生成技术。 RAG优势 部分解决了幻觉问题。由于我们可以控制检索内容的可靠性&#xff0c;也算是部分解决了幻觉问题。可以更实时。同理&#xff0c;可以控制输入给大模型上下文内容的时效性&#xff0c…

Day50:WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

目录 文件包含-原理&分类&利用&修复 文件读取 文件写入 代码执行 远程利用思路 黑盒利用-VULWEB 白盒利用-CTFSHOW-伪协议玩法 78-php&http协议 79-data&http协议 80-81-日志包含 87-php://filter/write&加密编码 88-data&base64协议 …

17、GateWay和Sentinel继承实现服务限流

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、需求说明 cloudalibaba-sentinel-gateway9528 保护 cloudalibaba-provider-payment9001 2、启动nacos服务器8848 startup.cmd -m standalone 3、启动sentinel服务器8080 java -jar sentinel-dash…

企业微信变更主体公证怎么弄?

企业微信变更主体有什么作用&#xff1f;现在很多公司都用企业微信来加客户&#xff0c;有时候辛辛苦苦积累了很多客户&#xff0c;但是公司却因为各种各样的原因需要注销&#xff0c;那么就需要通过企业微信变更主体的方法&#xff0c;把企业微信绑定的公司更改为最新的。企业…

恶意勒索软件VirLock,通过ApkAnalyser一键提取安卓应用APK敏感信息

恶意勒索软件VirLock&#xff0c;通过ApkAnalyser一键提取安卓应用APK敏感信息。 ############################# 免责声明&#xff1a;本文仅作收藏学习之用&#xff0c;亦希望大家以遵守《网络安全法》相关法律为前提学习&#xff0c;切勿用于非法犯罪活动&#xff0c;对于恶…

python和c语言的区别是什么

Python可以说是目前最火的语言之一了&#xff0c;人工智能的兴起让Python一夜之间变得家喻户晓&#xff0c;Python号称目前最最简单易学的语言&#xff0c;现在有不少高校开始将Python作为大一新生的入门语言。本萌新也刚开始接触Python&#xff0c;发现Python与其他语言确实有…

linux查找指定目录下包含指定字符串文件,包含子目录

linux查找指定目录下包含指定字符串的文件&#xff0c;包含子目录 linux查找指定目录下包含指定字符串的指定文件格式&#xff0c;包含子目录 指定目录 cd /home/www/linux查找指定目录下包含指定字符串的文件&#xff0c;包含子目录 grep -r "指定字符串"注释 gr…

测试开发工程师(QA)职业到底需要干些什么?part6:数据测试工程师QA

常见任务和工作内容 作为数据测试工程师QA&#xff08;Quality Assurance&#xff09;&#xff0c;您的主要职责是确保数据的质量、准确性和一致性。以下是数据测试工程师QA的一些常见任务和工作内容&#xff1a; 数据验证和准确性测试&#xff1a;您将负责验证数据的准确性和…