[网鼎杯 2020 青龙组]singal 1

前言

在主函数中找到了一个vm的译码器,译码器主要是解释传入的opcode,然后对我们输入的字符操作,这里我们发现他是单字节比较的,方法很多可以使用单字节映射,也可以是使用符号化执行,当然也可以硬着头皮去看

Angr

python 复制代码
import angr
import sys

def main(argv):
  path_to_binary = f'./signal.exe'
  project = angr.Project(path_to_binary)
  initial_state = project.factory.entry_state(
    add_options = { angr.options.SYMBOL_FILL_UNCONSTRAINED_MEMORY,
                    angr.options.SYMBOL_FILL_UNCONSTRAINED_REGISTERS}
  )
  simulation = project.factory.simgr(initial_state)

  def is_successful(state):
    stdout_output = state.posix.dumps(sys.stdout.fileno())
    return b'good,The answer format is:flag {}' in stdout_output # :boolean

  def should_abort(state):
    stdout_output = state.posix.dumps(sys.stdout.fileno())
    return b'what a shame...' in stdout_output
  simulation.explore(find=is_successful, avoid=should_abort)

  if simulation.found:
    solution_state = simulation.found[0]
    print(solution_state.posix.dumps(sys.stdin.fileno()).decode())
  else:
    raise Exception('Could not find the solution')

if __name__ == '__main__':
  main(sys.argv)

找到程序通过输出的话,和不通过输出的话,然后我们通过符号化执行,判断出输入的值

Ponce

使用ponce的话就麻烦很多,首先启动调试

将输入设置为符号化

到达判断点

这样就分析出了第一位,我们可以修改EIP一步步来,这样就可以得到所有的输入

相关推荐
Think Spatial 空间思维1 分钟前
【SSL部署与优化】HTTP/2与HTTPS的协同效应
安全·http·https·部署·ssl·优化
vortex53 分钟前
Bash fork 炸弹 —— :(){ :|:& };:
运维·服务器·开发语言·网络安全·bash
熬夜学编程的小王4 分钟前
【C++进阶篇】C++容器完全指南:掌握set和map的使用,提升编码效率
c++·set·map
花火QWQ5 分钟前
图论模板(部分)
c语言·数据结构·c++·算法·图论
xmweisi0214 分钟前
【Linux】ssh命令 – 安全的远程连接服务
linux·安全·ssh
Pacify_The_North20 分钟前
【进程控制二】进程替换和bash解释器
linux·c语言·开发语言·算法·ubuntu·centos·bash
superior tigre28 分钟前
C++学习:六个月从基础到就业——C++20:协程(Coroutines)
c++·学习·c++20
superior tigre33 分钟前
C++学习:六个月从基础到就业——C++20:概念(Concepts)
c++·学习·c++20
轮到我狗叫了40 分钟前
力扣310.最小高度树(拓扑排序,无向图),力扣.加油站力扣.矩阵置零力扣.二叉树中的最大路径和
算法·leetcode·职场和发展
埃菲尔铁塔_CV算法43 分钟前
深度学习驱动下的目标检测技术:原理、算法与应用创新(二)
深度学习·算法·目标检测