IDApython练习1-脚本去花

这里主要是练习IDApython脚本去花

1



这里

jz跳转条件是zf=1,

jnz跳转条件是zf=0,

但是zf就2种可能,所以无论如何都会跳转到loc_411DDF+3的位置,等于jmp loc_411DDF+3.

这里可以等长度的nop,我们可以手动nop,这里是脚本练习,需要我们自己写

import idc
def clear(start_ea,end_ea):
s_o_h=[0x74,0x05,0x75,0x03,0xe8,0x11,0x00]
while start_ea<end_ea:
if idc.get_bytes(start_ea,7)==bytes(s_o_h):
for i in range(7):
idc.patch_byte(start_ea+i,0x90)
start_ea+=1 start_ea=0x00411DC0
end_ea=0x00411E1E
clear(start_ea,end_ea)
print("ok")



2



xor eax,eax

这个运算结果为0,zf为1

触发jz跳转

import idc
def clear(start_ea,end_ea):
s_o_h=[0xe8,0x1a,0xe9]
while start_ea<end_ea:
if idc.get_bytes(start_ea,len(s_o_h))==bytes(s_o_h):
for i in range(len(s_o_h)):
idc.patch_byte(start_ea+i,0x90)
start_ea+=1 start_ea=0x000411DC0
end_ea=0x00411E1E
clear(start_ea,end_ea)
print("ok")

第四届“长城杯” 信息安全铁人三项赛 初赛junk



这里call loc_400F64

会把我们的返回地址压栈

 loc_400F64:                             ; CODE XREF: sub_400F40+1E↑j
.text:0000000000400F64 58 pop rax #从栈顶拿返回地址 rax=返回地址
.text:0000000000400F65 90 nop
.text:0000000000400F66 48 83 C0 0A add rax, 0Ah #rax+=10 相当于返回地址+10
.text:0000000000400F6A 50 push rax #重新把返回地址压栈
.text:0000000000400F6B C3 retn #返回到返回地址

这个函数大概作用就是把返回地址+10,

我们的返回地址是.text:0000000000400F63

加10变成

.text:0000000000400F6D

import idc
def clear(start_ea,end_ea):
s_o_h=[0xe8,0x1,0x00,0x00,0x00,0xe9,0x58,0x90,0x48,0x83,0xc0,0x0A,0x50,0xc3,0xe9]
while start_ea<end_ea:
if idc.get_bytes(start_ea,len(s_o_h))==bytes(s_o_h):
for i in range(len(s_o_h)):
idc.patch_byte(start_ea+i,0x90)
start_ea+=1
start_ea=0x00400F40
end_ea=0x000040106F
clear(start_ea,end_ea)
print("ok")



后面发现



同样道理,但是我们写精准一点

import idc
def clear(start_ea,end_ea):
s_o_h_head=[0xe8,0x1,0x00,0x00,0x00]
Machine_code=0xe9
s_o_h_tail=[0x58,0x90,0x48,0x83,0xc0,0x0A,0x50,0xc3,]
while start_ea<end_ea:
if idc.get_bytes(start_ea,len(s_o_h_head))==bytes(s_o_h_head):
temp_now_ea=start_ea
temp_now_ea+=len(s_o_h_head)+1
if idc.get_bytes(temp_now_ea,len(s_o_h_tail))==bytes(s_o_h_tail):
for i in range(len(s_o_h_head)+len(s_o_h_tail)+2):
idc.patch_byte(start_ea+i,0x90)
start_ea+=1 start_ea=0x00004009AE
end_ea=0x00000400AB7
clear(start_ea,end_ea)
print("ok")

21年WUST校赛AskforU



esp指向栈顶,而栈顶是返回地址,导致返回地址+1



确定好特征后开始写

import idc
def clear(start_ea,end_ea):
s_o_h=[0xE8, 0x06, 0x00, 0x00, 0x00, 0xEB, 0xE9, 0x05, 0x00, 0x00,
0x00, 0x83, 0x04, 0x24, 0x01, 0xC3]
while start_ea<end_ea:
if idc.get_bytes(start_ea,len(s_o_h))==bytes(s_o_h):
for i in range(len(s_o_h)):
idc.patch_byte(start_ea+i,0x90)
start_ea+=1
start_ea=0x000401490
end_ea=0x0004017CD
clear(start_ea,end_ea)
print("ok")

[SCTF2019]babyre

import idc
ea_start=0x000798
ea_end=0x00F66
s_o_h=[0x72,0x03,0x73,0x01]
while ea_start<ea_end:
if idc.get_bytes(ea_start,len(s_o_h))==bytes(s_o_h):
for i in range(len(s_o_h)+1):
idc.patch_byte(ea_start+i,0x90)
ea_start+=i
ea_start+=1
print("ok")

2022长城杯-rabbit_hole_release

这里面有2种花

第一种,这种只用去掉0xeb就行



第二种



按静态分析解析成这样



import idc

def s_o_h(start_ea,end_ea):
soh=[0xeb,0xff,0xc0,0x48]
while start_ea<end_ea:
if idc.get_bytes(start_ea,4)==bytes(soh):
for i in range(3):
idc.patch_byte(start_ea+i,0x90)
start_ea+=3
start_ea+=1 def s_o_h1(start_ea,end_ea):
soh=[0x66,0xb8,0xeb,0x05,0x31,0xc0,0x74,0xfa,0xe8]
while start_ea<end_ea:
if idc.get_bytes(start_ea,len(soh))==bytes(soh):
for i in range(len(soh)):
idc.patch_byte(start_ea+i,0x90)
start_ea+=len(soh)
start_ea+=1 start_ea=0x0004016C0
end_ea=0x000401A3B s_o_h(start_ea,end_ea)
s_o_h1(start_ea,end_ea)
print("ok")

IDApython练习1-脚本去花的更多相关文章

  1. 利用shell脚本去备份幸运28源码搭建下载所指定的数据库

    #! /bin/bash幸运28源码搭建下载Q[115288oo99]logintool=/home/yx/server/mysql/mysql/bin/mysqldumptool=/home/yx/ ...

  2. DD-WRT自定义脚本更新花生壳DDNS

    N年以前买了一个tp-link 841n v7,一直用的还算可以吧,除了不定期重启路由器,不然网速慢的龟爬啊!这也是TP原厂固件的通病,于是刷了DD-WRT,话说DD确实很爽,除了功能强大之外,而且很 ...

  3. Javascript数组迭代精髓,拿去花

    数组迭代 数组迭代是处理各数组的利器,编写代码时常常会用到,为我们提供了大大的便利.如果还不知道,真的别告诉别人你知道js哈哈. 以下迭代方法均不会改变原数组,带*为必选对象. 1.arr.forEa ...

  4. 阿里云ECS服务器上搭建keepalived+mha+mysql5.6+gtid+一主两从+脚本判断架构踩的坑

    最近,公司项目搭建了一套后端数据库架构,不是在RDS,是在阿里云的ECS服务器上搭建keepalived.mha.mysql5.6.gtid.一主两从架构,目前还没有实现读写分离,以后架构升级,可能代 ...

  5. DOS批处理脚本

    先概述一下批处理是个什么东东.批处理的定义,至今我也没能给出一个合适的----众多高手们也都没给出----反正我不知道----看了我也不一定信服----我是个菜鸟,当然就更不用说了:但我想总结出一个“ ...

  6. 过来人告诉你,去工作前最好还是学学Git

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前遇到过很多同学私信问我:「三歪,我马上要实习 ...

  7. SQL Server 2012 数据库数据导出为脚本

    转自:http://blog.csdn.net/ituff/article/details/8265822 将高版本的的SQL Server数据库移到低版本的SQL Server是一件十分蛋疼的事,最 ...

  8. 用php脚本给html中引用的js和css路径打上版本

    比如 <link rel="stylesheet" type="text/css" href="./css/globel.css"&g ...

  9. Unity3D热更新全书-脚本(二) 两级分化

    上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...

  10. 使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】

    一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件, ...

随机推荐

  1. Spring源码:Bean生命周期(四)

    前言 在之前的文章中,我们介绍了 Bean 的核心概念.Bean 定义的解析过程以及 Bean 创建的准备工作.在今天的文章中,我们将深入探讨 Bean 的创建过程,并主要讲解 createBean ...

  2. vue全家桶进阶之路20:ECMAScript脚本语言规范

    ECMAScript(简称 ES)是一种由 Ecma 国际组织定义的脚本语言标准,它定义了 JavaScript 语言的基本规范和特性.JavaScript 是一种基于 ECMAScript 标准的编 ...

  3. vue使用import()提示语法错误

    一.使用import 引入 组件 二.编译时提示语法检测错误 三.解决方法 第一种方式:直接安装 D:\YLKJPro\CMWEB\03Implement\CustomMapWeb>npm in ...

  4. qq飞车端游最全按键指法教学

    目录 起步篇 超级起步 弹射起步 段位起步 基础篇 点飘 撞墙漂移 撞墙点喷 进阶篇 双喷 叠喷 断位漂移 段位双喷 侧身漂移 快速出弯 CW WCW CWW 牵引 甩尾点飘 甩尾漂移 右侧卡 左侧卡 ...

  5. JavaScript如何解决单线程缺陷——webWorker

    解决JavaScript单线程问题--webWorkers 参考文档 使用 Web Workers - Web API 接口参考 | MDN (mozilla.org) MDN的介绍为: Web Wo ...

  6. 关于VS2022使用EF生成实体模型报错的问题:运行转换:System.NullReferenceException:对象引用未设置为对象的示例。

    起因: 之前版本vs2022生成EF模型一直没有问题,在更新了最新的vs2022之后,版本号17.6+,出现此问题: 运行转换:System.NullReferenceException:对象引用未设 ...

  7. Hbase的JavaAPI和数据存储

    导入Maven依赖 <dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> ...

  8. 微信小程序如何使用原生Websocket与Asp.Net Core SignalR 通信

    背景 如题,这可能算是.net 做小程序的服务端时,绕不开的一个问题,老生常谈了.同样的问题,我记得我2018/19年的一个项目的解决方案是: 修改官方的SignalR.js的客户端:把里面用到浏览器 ...

  9. Linux安装MongoDB 4.0.3

    Linux安装MongoDB 4.0.3   1.准备 CentOS下安装MongoDB 官网提供windows.Linux.OSX系统环境下的安装包,这里主要是记录一下在Linux下的安装.首先到官 ...

  10. 如何从AWS中学习如何使用AmazonVPC

    目录 如何从 AWS 中学习如何使用 Amazon VPC? 随着 AWS 的迅速发展,Amazon VPC(Virtual Private Cloud)已经成为了一种非常重要的云计算基础设施.VPC ...