Angr安装与使用之使用篇(十八)
针对angr提供的练习题,现在进行求解16_angr_arbitrary_write,它也是关于hook输入的问题,需要使用angr求解出正确密码。但是需要提供排除地址以减少路径求解时间。
具体代码如下所示
import angr
import claripy
import sysdef main(argv):path_to_binary = argv[1]project = angr.Project(path_to_binary)initial_state = project.factory.entry_state()#使用hook替换__isoc99_scanf函数class ReplacementScanf(angr.SimProcedure):# Hint: scanf("%u %20s")def run(self, format_string, p1,p2):scanf0 = claripy.BVS('scanf0', 32)scanf1 = claripy.BVS('scanf1', 20*8)for char in scanf1.chop(bits=8):self.state.add_constraints(char >= 'A', char <= 'Z')scanf0_address = p1self.state.memory.store(scanf0_address, scanf0, endness=project.arch.memory_endness)scanf1_address = p2self.state.memory.store(scanf1_address, scanf1, endness=project.arch.memory_endness)self.state.globals['solutions'] = (scanf0,scanf1)scanf_symbol = '__isoc99_scanf' # :stringproject.hook_symbol(scanf_symbol, ReplacementScanf())#检查strncpy函数def check_strncpy(state):# The stack will look as follows:# ... ________________# esp + 15 -> / \# esp + 14 -> | param2 |# esp + 13 -> | len |# esp + 12 -> \________________/# esp + 11 -> / \# esp + 10 -> | param1 |# esp + 9 -> | src |# esp + 8 -> \________________/# esp + 7 -> / \# esp + 6 -> | param0 |# esp + 5 -> | dest |# esp + 4 -> \________________/# esp + 3 -> / \# esp + 2 -> | return |# esp + 1 -> | address |# esp -> \________________/#利用memory.load方法提取参数内容strncpy_src = state.memory.load(state.regs.esp+8,4,endness=project.arch.memory_endness)strncpy_dest = state.memory.load(state.regs.esp+4,4,endness=project.arch.memory_endness)strncpy_len = state.memory.load(state.regs.esp+12,4,endness=project.arch.memory_endness)#使用memory.load方法把src真正的内容提取出来src_contents = state.memory.load(strncpy_src,strncpy_len)#判断src_contents及strncpy_dest是否为symbolicif state.se.symbolic(src_contents) and state.se.symbolic(strncpy_dest):password_string = 'NDYNWEUJ' # :stringbuffer_address = 0x57584344 # :integer, probably in hexadecimaldoes_src_hold_password = src_contents[-1:-64] == password_stringdoes_dest_equal_buffer_address = strncpy_dest ==buffer_address# 判定strncpy_dest是否为password_buffe的地址if state.satisfiable(extra_constraints=(does_src_hold_password, does_dest_equal_buffer_address)):state.add_constraints(does_src_hold_password, does_dest_equal_buffer_address)return Trueelse:return Falseelse: # not state.se.symbolic(???)return Falsesimulation = project.factory.simgr(initial_state)def is_successful(state):strncpy_address = 0x08048410if state.addr == strncpy_address:return check_strncpy(state)else:return Falsesimulation.explore(find=is_successful)if simulation.found:solution_state = simulation.found[0]stored_solution0 , stored_solution1 = solution_state.globals['solutions']solution0=solution_state.solver.eval(stored_solution0)solution1=solution_state.solver.eval(stored_solution1,cast_to=bytes)print('solutions are {0},{1}'.format(solution0,solution1))else:raise Exception('Could not find the solution')if __name__ == '__main__':main(sys.argv)
要想得到正确的输出,需要检查strncpy函数,此函数地址为0x08048410,即strncpy_address=0x08048410。
此strncpy函数接收3个输入,分别取出strncpy_src、strncpy_dest和strncpy_len这三个参数。
需要判断src_contents及strncpy_dest,此时需要用到strncmp函数,此函数接收‘NDYNWEUJ’及passwork_buffer,分别将src_contents[-1:-64]、strncpy_dest与‘DVTBOGZL’、0x57584344 进行比较,若相等则返回True。
下面验证实验结果
执行刚刚写好的程序,保存为scaffold16.py,并将其与16_angr_arbitrary_write放于同一文件夹中,具体如下图所示。
再执行16_angr_arbitrary_write,然后需要我们输入angr刚刚求解出的密码,结果如下
然而,参考其他求解代码,他们得到‘Good Job’,而在本人虚拟机中运行,结果均为‘Segmentation falut’,不知什么原因,如果有哪个小伙伴知道,欢迎告知原因。
Angr安装与使用之使用篇(十八)相关推荐
- 三菱880彩铅和uni的区别_彩铅工具测评 篇十八:新手想要花卉/多肉更有层次感?来试试三菱uni880彩铅!...
彩铅工具测评 篇十八:新手想要花卉/多肉更有层次感?来试试三菱uni880彩铅! 2020-05-01 15:53:47 5点赞 6收藏 0评论 花卉/多肉是我自学彩铅的重要动力,红辉颜色清新淡雅,特 ...
- 快速入门 | 篇十八:正运动技术脉冲型运动控制器的使用
视频教程:<正运动技术脉冲型运动控制器的使用> 今天,正运动技术来分享一下,脉冲型运动控制器的使用入门.首先,我们从准备工作讲起,然后依次讲控制器与电脑连接.控制器参数设置.驱动器参数设置 ...
- 疑难杂症篇(十八)--ROS系统中使用SLAM算法建图时出现地图漂移的几种原因
本篇主要介绍在ROS系统中使用SLAM算法建地图时出现地图定位漂移的几种原因及可以采取的措施. 1.SLAM建图时出现的定位漂移现象 2.原因分析 里程计数据发生异常: 计算机的配置不高,计算机建图过 ...
- Ubuntu18.04安装福昕阅读器(六十八)
Ubuntu18.04安装福昕阅读器 1.下载福昕阅读器 https://www.foxitsoftware.com/pdf-reader2.解压 # tar zxvf FoxitReader.enu ...
- .Net转Java自学之路—基础巩固篇十八(正则)
正则表达式: 正则就是用于操作字符串的规则.其中是以一些符号来标识规则. 字符类: [] :范围 - :连接符 ^ :非 预定义字符类: . :任何字符 \d :数字 \D :非数字 \s :空白字符 ...
- WF4.0 基础篇 (十八) Flowchar
本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...
- [网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Python弱口令攻击.自定义字典生成,并构建了Web目录扫描器:本文将 ...
- Python小白到老司机,快跟我上车!基础篇(十八)
线程与进程的相关概念 关于线程和进程的话题,大部分的书只是微微提下,读者学完云里雾里,不知所以.本章会对Python中的多线程和多进程进行详解.大部分都是概念性的东西,不要去死记硬背,学完了解有个大概 ...
- 普林斯顿微积分读本篇十八:复数
- Python遥感图像处理应用篇(十八):GDAL +numpy对遥感图像归一化处理
1.使用数据 所用输入数据为遥感影像数据,可以是单波段也可以是多波段数据. 运行环境:windows10 pycharm python3.7.7 GDAL-3.2.3-cp37-cp37m-wi ...
最新文章
- tcpdump抓包对性能的影响
- 软件架构自学笔记--大学学的软件工程为什么感觉很“虚”
- Python程序反转给定数字(2种不同方式)
- 头像和Karma汽车
- python实现简单的名字管理系统_python列表使用实现名字管理系统
- 疑似华为P30系列售价曝光:欧洲售价最高8400元
- xml没有提示解决办法eclipse
- linux 进程状态 load,Linux - 系统指标 CPU load
- VMware相关的缩略语和缩略语
- Flutter 是移动应用程序开发的未来?
- BZOJ5475 WC2019数树(prufer+容斥原理+树形dp+多项式exp)
- asp.net GridView控件的列属性
- Vue+SpringBoot的微信登录
- 乐优商城第五天(Vue.js)
- matlab 动态面板数据分析,MATLAB空间面板数据模型操作简介 空间面板数据模型
- android 分区 加密软件,VeraCrypt(硬盘分区加密软件)
- 36氪专访| 友盟+CEO朋新宇:大数据赛道会越来越宽,同时也会越来越头部化
- Spring 全家桶,永远滴神
- win10+yolov5尝鲜体验
- 轻松查询多个韵达快运最后物流中含有某个地方的单号