符号执行之angr_ctf

news2024/9/29 23:37:35

前言

angr_ctf
之前一直弄环境没弄好,现在都解决了,终于可以全部过一遍了,仓库提供了三个部分的文件,一个是源码编译部分,一个是编译好的文件的集合最后是每题的题解部分分别在
在这里插入图片描述
值得注意的是编译好的文件都是elf类型的,所以最好采用Linux运行脚本,而且默认版本是python2的,使用它提供的模板时最好修改下print打印函数添加括号,其它部分倒没什么需要解决的

00_angr_find

可恶,编译好的windows版本一直不能运行,显示地址错误,不知道是不是开启了随机地址, 关了也没法
在这里插入图片描述

输入字符经过加密后等于QWSYJIQP,输出Good Job字符

#!/usr/bin/env python3

import angr
import sys
import os

def main():
  proj = angr.Project('/root/桌面/python-x/angr_ctf/solutions/00_angr_find/00_angr_find',auto_load_libs=False)
  initial_state = proj.factory.entry_state()
  pg = proj.factory.simgr(initial_state)
  pg.explore(find=0x804867d)
  print(pg.found[0].posix.dumps(0))

if __name__ == '__main__':
  main()

一个最基本的框架结构,事实上还可以更简化点

  • Project表示新建项目,载入大致基本信息,auto_load_libs=false表示不载入相关库文件,可以删掉,但默认会载入,会浪费些时间
  • entry_state创建新建状态,为后面模拟器初始化,可以理解成新建的对象,类,返回一个状态的对象
  • simgr新建模拟器,参数表示以该传入对象初始化模拟器,一般angr代码中这三个之后才能开始探索一类的事务
  • explore得到指定地址的输入,如果找到了返回一个数组,found[0]中保存有得到的路径的状态

不知道为什么windows中idapro反编译的地址和在Linux中的地址有一点细微的差别,导致找了半天
QTMPXTYU

01_angr_avoid

进去后main函数比较大,不能直接被反编译,当然想反编译也可以改一下配置文件但没必要,只需要知道find和avoid地址即可,因为函数比较大,不加避免条件就会一直跑卡死
explore(self, stash=None, n=None, find=None, avoid=None, find_stash=None, avoid_stash=None, cfg=None,
num_find=1, **kwargs)
在这里插入图片描述
分析也可以发现,不能进入avoid_me函数,他会把succeed变为0,判断的时候会影响跳转
在这里插入图片描述

import angr
Proj =angr.Project('/root/桌面/python-x/angr_ctf/solutions/01_angr_avoid/01_angr_avoid',auto_load_libs=False)
State =Proj.factory.entry_state()
Sim =Proj.factory.simgr(State)
Sim.explore(find =0x080485ed,avoid=0x080485a8)
print(Sim.found[0].posix.dumps(0))
                                     

RNGFXITY

02_angr_find_condition

和01不同,输出again 的地址固定都位于同一个函数中,所以我们避免执行这个函数地址即可,但这里在main函数中很多地方直接调用输出try again,不可能同时avoid这么多地址所以需要用函数进行判断,所以expolre第二种传参方式即可以通过函数传参

在这里插入图片描述

import angr
def good(state):
    a =state.posix.dumps(1)
    return True if 'Good Job' in a.decode('utf-8') else False
def Try(state):
    b =state.posix.dumps(1)
    return True if 'Try again' in b.decode('utf-8') else False
Proj =angr.Project('/root/桌面/python-x/angr_ctf/solutions/02_angr_find_condition/02_angr_find_condition',auto_load_libs=False)
State =Proj.factory.entry_state()
Sim =Proj.factory.simgr(State)
Sim.explore(find =good,avoid=Try)
print(Sim.found[0].posix.dumps(0))

0表示标准输入,1表示标准输出, a in b:a是否被包含在b中

03_angr_symbolic_registers

有多个变量的输入,angr无法像之前一样对输入直接爆破,需要从指定位置angr可以爆破的位置开始,所以我们需要自定义状态,entry_state默认从main函数开始
在这里插入图片描述
我们可以直接对寄存器赋值符号变量
可以使用project.factory.blank_state(addr=start_address)替代原有entry_state,blank中可以传递参数addr定义模块开始运行地址

import angr
import sys
import claripy
pro =angr.Project(sys.argv[1],auto_load_libs=False)
initial_state =pro.factory.blank_state(addr =0x080488D1)

#定义符号向量,给寄存器赋值
eax =claripy.BVS('eax',32)
ebx =claripy.BVS('ebx',32)
edx =claripy.BVS('edx',32)
initial_state.regs.eax =eax
initial_state.regs.ebx =ebx
initial_state.regs.edx =edx

sim =pro.factory.simgr(initial_state)
def good(state):
    return 'Good Job' in state.posix.dumps(1).decode('utf-8')
def again(state):
    return 'Try again' in state.posix.dumps(1).decode('utf-8')
sim.explore(find =good,avoid =again)
one =format(sim.found[0].solver.eval(eax),'x')
two =format(sim.found[0].solver.eval(ebx),'x')
three =format(sim.found[0].solver.eval(edx),'x')
print(one+' '+two+' '+three)

db01abf7 4930dc79 d17de5ce

04_angr_symbolic_stack

和上题不一样,上题可以直接通过寄存器传参这里只能通过栈
在这里插入图片描述
分析栈结构可知,参数地址在ebp-8~ebp-0c和ebp-0c:ebp-10所以要对赋值的ebp-8预留八位对齐参数

import angr
import sys
import claripy
pro =angr.Project(sys.argv[1])
ad =0x08048697
state =pro.factory.blank_state(addr=ad)
a1 =claripy.BVS('a1',32)
a2 =claripy.BVS('a2',32)
state.regs.ebp =state.regs.esp
state.regs.esp -=8
state.stack_push(a2)
state.stack_push(a1)
sim =pro.factory.simgr(state)
def good(a):
    return 'Good' in a.posix.dumps(1).decode('utf-8')
def again(b):
    return 'again' in b.posix.dumps(1).decode('utf-8')
sim.explore(find=good,avoid=again)
output1 =format(sim.found[0].solver.eval(a1),'u')
output2 =format(sim.found[0].solver.eval(a2),'u')
print(output1+' '+output2+' ')

1213922930 1153451551

05_angr_symbolic_memory

和上题的栈很像,只是这里需要将符号变量放入内存,现在理解的就是angr通过定义指定约束的符号变量,然后将这个变量放入指定位置,存储空间可以是一切存储介质,内存,寄存器,栈等

import angr
import sys
import claripy

pro = angr.Project(sys.argv[1])
ad = 0x08048603
state = pro.factory.blank_state(addr=ad)

meom1 = claripy.BVS('meom1', 64)
meom2 = claripy.BVS('meom2', 64)
meom3 = claripy.BVS('meom3', 64)
meom4 = claripy.BVS('meom4', 64)

ad1 = 0xa29faa0
ad2 = 0xa29faa8
ad3 = 0xa29fab0
ad4 = 0xa29fab8

# 将符号变量存入内存
state.memory.store(ad1, meom1)
state.memory.store(ad2, meom2)
state.memory.store(ad3, meom3)
state.memory.store(ad4, meom4)

smg = pro.factory.simgr(state)


def good(a):
    return 'Good' in a.posix.dumps(1).decode('utf-8')


def bad(b):
    return 'Try' in b.posix.dumps(1).decode('utf-8')


smg.explore(find=good, avoid=bad)

# 约束求解
if smg.found[0]:
    s1 = smg.found[0].solver.eval(meom1, cast_to=bytes)
    s2 = smg.found[0].solver.eval(meom2, cast_to=bytes)
    s3 = smg.found[0].solver.eval(meom3, cast_to=bytes)
    s4 = smg.found[0].solver.eval(meom4, cast_to=bytes)
    print("05:{} {} {} {}".format(s1.decode('utf-8'), s2.decode('utf-8'), s3.decode('utf-8'), s4.decode('utf-8')))
else:
    print("NULL")


状态初始化的地址需要为scanf后面

06_angr_symbolic_dynamic_memory

输入的空间是使用函数开辟的,因此不能像前面一样直接获得准确地址,所以我们可以直接为指针添加我们指定位置和空间作为符号向量的存储地
在这里插入图片描述

import angr
import sys
import claripy

pro =angr.Project(sys.argv[1])
ad =0x0804869e
state =pro.factory.blank_state(addr =ad)

m1 =claripy.BVS('m1',64)
m2 =claripy.BVS('m2',64)

ad1 =0x0a79a118
ad2 =0x0a79a120
ad3 =0x0a799cc0
ad4 =0x0a79a120

state.memory.store(ad1,ad3,endness=pro.arch.memory_endness)
state.memory.store(ad2,ad4,endness=pro.arch.memory_endness)

state.memory.store(ad3,m1)
state.memory.store(ad4,m2)

smg =pro.factory.simgr(state)

def good(a):
    return 'Good' in a.posix.dumps(1).decode('utf-8')


def bad(b):
    return 'Try' in b.posix.dumps(1).decode('utf-8')
smg.explore(find =good,avoid =bad)

if smg.found:
    s1 = smg.found[0].solver.eval(m1, cast_to=bytes)
    s2 = smg.found[0].solver.eval(m2, cast_to=bytes)
    print("05:{} {}".format(s1.decode('utf-8'), s2.decode('utf-8')))
else:
    print("NULL")

如果state地址不是scanf后面的地址会出现卡死,输入地址没有更改会找不到路径,相信把所有遇到的错误都记下,他们肯定是有限的,就能完全熟练了
IDMRHRCZ PLBQSLBO

07_angr_symbolic_file

输入由内存变成了文件读取输入,创建文件符号向量
在这里插入图片描述
状态开始地址设为88ef处,add esp,10h清空之前的栈

# -*- coding:utf-8 -*-
import angr
import sys
import claripy

pro = angr.Project(sys.argv[1])
ad = 0x080488ef

# 创建文件的符号向量
file = 'WCEXPXBW.txt'
file_size = 64
symbol = claripy.BVS('symbol', file_size * 8)
symbol_file = angr.SimFile(file, content=symbol, size=file_size)

state = pro.factory.blank_state(addr=ad, fs={file: symbol_file})
sim = pro.factory.simgr(state)


def good(a):
    return 'Good' in a.posix.dumps(1).decode('utf-8')


def bad(b):
    return 'Try' in b.posix.dumps(1).decode('utf-8')


sim.explore(find=good, avoid=bad)
if sim.found:
    res = sim.found[0].solver.eval(symbol, cast_to=bytes)
    print('06: {}'.format(res.decode('utf-8')))
else:
    raise Exception('No result')

GQLWJWWI
参考链接:
https://www.cnblogs.com/level5uiharu/p/16925991.html
https://space.bilibili.com/386563875/channel/seriesdetail?sid=1835245
https://blog.gentlecp.com/article/61784.html

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

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

相关文章

Python批量查字典和爬取双语例句

最近,有网友反映,我的批量查字典工具换到其它的网站就不好用了。对此,我想说的是,互联网包罗万象,网站的各种设置也有所不同,并不是所有的在线字典都可以用Python爬取的。事实上,很多网站为了防…

不用学PS,这个在线UI设计工具也让你秒变设计大神!

在线 UI 设计工具的独特之处在于其卓越的协作和实时性能,能够支持原型图形界面和用户体验设计,并提供团队在线协作设计功能。与竞争对手如 Adobe XD 和 Sketch 相比,它具备让不同地点和专业人员实时查看和处理设计项目的能力,从而…

秋招算法备战第37天 | 738.单调递增的数字、968.监控二叉树、贪心算法总结

738. 单调递增的数字 - 力扣(LeetCode) 这个问题是关于找到一个小于或等于给定数字n的最大单调递增数字。 我们可以将数字n转换为字符数组,然后从左到右扫描,寻找第一个违反单调递增条件的位置。一旦找到这样的位置,…

俄罗斯方块

俄罗斯方块简单实现 使用 pygame 模块实现俄罗斯方块的简单实现,这里没有使用pygame 自带的碰撞检测,而是自定义的方法实现边界碰撞和方块间碰撞检测。 代码实现 import random import pygame import time # 初始化游戏 pygame.init()# 设置游戏窗口大…

libcurl开源的、跨平台的网络传输库,用于在程序中实现数据传输功能的编译

文章目录 前言1、libcurl关键特点和功能2、没有使用openssl以及libssh2编译libcurl的文件和使用openssl和libssh2编译3、libcurl网络库的下载4、libcurl网络库的编译4.1、直接使用cmake编译,不使用 OpenSSL 和 libssh2库编译的出来的libcurl库4.2、使用 OpenSSL 和 …

windows之关闭占用端口的进程

1. 查询端口占用进程,这里以8001为例 netstat -ano | findstr 8001 2.结束进程 taskkill -pid 37072 -f

解释器模式-自定义语言的实现

有时,我们希望输入一串字符串,然后计算机能够按照预先定义的文法规则来对这个字符串进行解释,从而实现相应的功能。 例如,我们想实现简单的加减法接收器,只需输入一个表达式,它就能计算出表达式结果。比如…

SpringBoot统一功能处理(拦截器)

1.用户登录权限校验 1.1自定义拦截器 写一个类去实现HandlerInterceptor接口表示当前类是一个拦截器,再重写HandlerInterceptor接口中的方法,preHandle为在方法执行前拦截,postHandle为方法执行中拦截,afterCompletion为方法执行中拦截.需要在什么时候拦截就重写什么方法 Co…

微信公众号自动登录方案

基于微信公众号登录 借助微信公众号来试实现社区登录。登录的时候展示的是一个二维码,但实际上的操作是借助这个展示的过程,和前端构建一个半长连接,当用户向公众号发送验证码之后,微信公众平台会将用户发送的消息转发给服务器&a…

Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)

文章目录 Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)服务器端大体结构图BLL层(控制层)DAL层(数据控制层)模型层DLC 服务器配置类 发送消息类 以及消息类 Unity进阶–通过PhotonServer实现联网…

Gartner发布《2023年全球RPA魔力象限》:90%RPA厂商,将提供生成式AI自动化

8月3日,全球著名咨询调查机构Gartner发布了《2023年全球RPA魔力象限》,通过产品能力、技术创新、市场影响力等维度,对全球16家卓越RPA厂商进行了深度评估。 弘玑Cyclone(Cyclone Robotics)、来也(Laiye&am…

【蓝图】p47下车减速功能

p47下车减速功能 p47下车减速功能加速功能下车减速功能 p47下车减速功能 加速功能 上图是ue自带的加速功能,检测到按w时输入轴会传1给设置油门输入,就会加速 所以,减速也可以通过蓝图反方向制作 下车减速功能 打开Sedan蓝图类的上下车图表…

day51-Mybatis-Plus/代码生成器

1.Mybatis-Plus 定义&#xff1a;是一个Mybatis的增强工具&#xff0c;只在Mybatis基础上增强不做改变&#xff0c;简化开发&#xff0c;提升效率 2.MP实战 2.1 创建springboot工程&#xff0c;勾选web&#xff0c;引入依赖 <dependency> <groupId>mysql<…

人工智能可解释性分析导论(初稿)

目录 思维导图 1.黑箱所带来的问题 2.从应用面论述为什么要进行可解释性分析 2.1可解释性分析指什么 2.2可解释性分析结合人工智能应用实例 2.3 可解释性分析的脑回路&#xff08;以可视化为例如何&#xff09; 3.如何研究可解释性分析 3.1使用好解释的模型 3.2传统机器学…

antDv table组件滚动截图方法的实现

在开发中经常遇到table内容过多产生滚动的场景&#xff0c;正常情况下不产生滚动进行截图就很好实现&#xff0c;一旦产生滚动就会变得有点棘手。 下面分两种场景阐述解决的方法过程 场景一&#xff1a;右侧不固定列的情况 场景二&#xff1a;右侧固定列的情况 场景一 打开…

理解树的结构

树的重要性 二分查找算法、几种核心的排序算法以及图算法都与树有非常密切的关系。有句话锁&#xff0c;“没学会树&#xff0c;算法相当于白学”&#xff0c;可见&#xff0c;树在算法中的地位。 树的考察方面 层次遍历以及拓展问题 前后序遍历与拓展问题 中序遍历与搜索树问…

数据结构入门指南:带头双向循环链表

目录 文章目录 前言 1.结构与优势 2.链表实现 2.1 定义链表 2.2 创建头节点 2.3 尾插 2.4 输出链表 2.5 尾删 2.6 头插 2.7头删 2.8 节点个数 2.9 查找 2.10 位置插入 2.11 位置删除 2.12 销毁链表 3. 源码 总结 前言 链表一共有8种结构&#xff0c;但最常用的就是无头单…

Docker网络模型使用详解(2)Docker网络模式

安装Docker时会自动创建3个网络&#xff0c;可以使用docker network ls命令列出这些网络。 [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ebcfad6f4255 bridge bridge local b881c67f8813 compose_lnmp_lnmp…

Vue2升级Vue3报错:Right-hand side of ‘instanceof‘ is not an object

属性prop设置多类型报错&#xff1a; Vue2 写法&#xff1a;支持用竖线隔开。Vue2 Prop expandLevel: {type: Number | String,default: 1, }, Vue3 写法&#xff1a;改为数组&#xff0c;不支持竖线隔开。Vue3 Prop expandLevel: {type: [Number, String],default: 1, }

二次元美少女【InsCode Stable Diffusion 美图活动一期】

目录 Stable Diffusion 模型在线使用地址 一、背景介绍 二、模板介绍&#xff1a; 三、操作步骤 1.在线运行地址 2.进入在线运行网址&#xff0c;并点击运行及使用 3.购买GPU并创建项目 4.打开工作台并选择算力资源 5.点击下图中所示框框 6.进入Stable Diffusion WebU…