针对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安装与使用之使用篇(十八)相关推荐

  1. 三菱880彩铅和uni的区别_彩铅工具测评 篇十八:新手想要花卉/多肉更有层次感?来试试三菱uni880彩铅!...

    彩铅工具测评 篇十八:新手想要花卉/多肉更有层次感?来试试三菱uni880彩铅! 2020-05-01 15:53:47 5点赞 6收藏 0评论 花卉/多肉是我自学彩铅的重要动力,红辉颜色清新淡雅,特 ...

  2. 快速入门 | 篇十八:正运动技术脉冲型运动控制器的使用​

    视频教程:<正运动技术脉冲型运动控制器的使用> 今天,正运动技术来分享一下,脉冲型运动控制器的使用入门.首先,我们从准备工作讲起,然后依次讲控制器与电脑连接.控制器参数设置.驱动器参数设置 ...

  3. 疑难杂症篇(十八)--ROS系统中使用SLAM算法建图时出现地图漂移的几种原因

    本篇主要介绍在ROS系统中使用SLAM算法建地图时出现地图定位漂移的几种原因及可以采取的措施. 1.SLAM建图时出现的定位漂移现象 2.原因分析 里程计数据发生异常: 计算机的配置不高,计算机建图过 ...

  4. Ubuntu18.04安装福昕阅读器(六十八)

    Ubuntu18.04安装福昕阅读器 1.下载福昕阅读器 https://www.foxitsoftware.com/pdf-reader2.解压 # tar zxvf FoxitReader.enu ...

  5. .Net转Java自学之路—基础巩固篇十八(正则)

    正则表达式: 正则就是用于操作字符串的规则.其中是以一些符号来标识规则. 字符类: [] :范围 - :连接符 ^ :非 预定义字符类: . :任何字符 \d :数字 \D :非数字 \s :空白字符 ...

  6. WF4.0 基础篇 (十八) Flowchar

    本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...

  7. [网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)

    这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Python弱口令攻击.自定义字典生成,并构建了Web目录扫描器:本文将 ...

  8. Python小白到老司机,快跟我上车!基础篇(十八)

    线程与进程的相关概念 关于线程和进程的话题,大部分的书只是微微提下,读者学完云里雾里,不知所以.本章会对Python中的多线程和多进程进行详解.大部分都是概念性的东西,不要去死记硬背,学完了解有个大概 ...

  9. 普林斯顿微积分读本篇十八:复数

  10. Python遥感图像处理应用篇(十八):GDAL +numpy对遥感图像归一化处理

    1.使用数据 所用输入数据为遥感影像数据,可以是单波段也可以是多波段数据. 运行环境:windows10  pycharm  python3.7.7  GDAL-3.2.3-cp37-cp37m-wi ...

最新文章

  1. tcpdump抓包对性能的影响
  2. 软件架构自学笔记--大学学的软件工程为什么感觉很“虚”
  3. Python程序反转给定数字(2种不同方式)
  4. 头像和Karma汽车
  5. python实现简单的名字管理系统_python列表使用实现名字管理系统
  6. 疑似华为P30系列售价曝光:欧洲售价最高8400元
  7. xml没有提示解决办法eclipse
  8. linux 进程状态 load,Linux - 系统指标 CPU load
  9. VMware相关的缩略语和缩略语
  10. Flutter 是移动应用程序开发的未来?
  11. BZOJ5475 WC2019数树(prufer+容斥原理+树形dp+多项式exp)
  12. asp.net GridView控件的列属性
  13. Vue+SpringBoot的微信登录
  14. 乐优商城第五天(Vue.js)
  15. matlab 动态面板数据分析,MATLAB空间面板数据模型操作简介 空间面板数据模型
  16. android 分区 加密软件,VeraCrypt(硬盘分区加密软件)
  17. 36氪专访| 友盟+CEO朋新宇:大数据赛道会越来越宽,同时也会越来越头部化
  18. Spring 全家桶,永远滴神
  19. win10+yolov5尝鲜体验
  20. 轻松查询多个韵达快运最后物流中含有某个地方的单号

热门文章

  1. 使用WindowsHooks库制作和使用全局钩子
  2. JDK动态代理入门、JDK动态代理原理、为什么JDK动态代理是基于接口的
  3. SpringBoot配置多数据源(动态切换)
  4. 辞职的新方式:一言不合就消失!
  5. 常用 MySQL 操作
  6. Fiddler操作技巧
  7. @objc private 定义函数
  8. plsql developer 无法登录Oracle
  9. 在ArcScene中导入显示自己在SketchUp创建并经过修饰的模型
  10. #define和inline 的区别