IDApython练习1-脚本去花
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-脚本去花的更多相关文章
- 利用shell脚本去备份幸运28源码搭建下载所指定的数据库
#! /bin/bash幸运28源码搭建下载Q[115288oo99]logintool=/home/yx/server/mysql/mysql/bin/mysqldumptool=/home/yx/ ...
- DD-WRT自定义脚本更新花生壳DDNS
N年以前买了一个tp-link 841n v7,一直用的还算可以吧,除了不定期重启路由器,不然网速慢的龟爬啊!这也是TP原厂固件的通病,于是刷了DD-WRT,话说DD确实很爽,除了功能强大之外,而且很 ...
- Javascript数组迭代精髓,拿去花
数组迭代 数组迭代是处理各数组的利器,编写代码时常常会用到,为我们提供了大大的便利.如果还不知道,真的别告诉别人你知道js哈哈. 以下迭代方法均不会改变原数组,带*为必选对象. 1.arr.forEa ...
- 阿里云ECS服务器上搭建keepalived+mha+mysql5.6+gtid+一主两从+脚本判断架构踩的坑
最近,公司项目搭建了一套后端数据库架构,不是在RDS,是在阿里云的ECS服务器上搭建keepalived.mha.mysql5.6.gtid.一主两从架构,目前还没有实现读写分离,以后架构升级,可能代 ...
- DOS批处理脚本
先概述一下批处理是个什么东东.批处理的定义,至今我也没能给出一个合适的----众多高手们也都没给出----反正我不知道----看了我也不一定信服----我是个菜鸟,当然就更不用说了:但我想总结出一个“ ...
- 过来人告诉你,去工作前最好还是学学Git
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前遇到过很多同学私信问我:「三歪,我马上要实习 ...
- SQL Server 2012 数据库数据导出为脚本
转自:http://blog.csdn.net/ituff/article/details/8265822 将高版本的的SQL Server数据库移到低版本的SQL Server是一件十分蛋疼的事,最 ...
- 用php脚本给html中引用的js和css路径打上版本
比如 <link rel="stylesheet" type="text/css" href="./css/globel.css"&g ...
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- 使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】
一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件, ...
随机推荐
- 2022-10-06:以下go语言代码输出什么?A:[1 2 3] [1 2 3] ;B:[1 2 3] [3 4 5]; C:[1 2 3] [3 4 5 6 7 8 9];D:[1 2 3] [3
2022-10-06:以下go语言代码输出什么?A:[1 2 3] [1 2 3] :B:[1 2 3] [3 4 5]: C:[1 2 3] [3 4 5 6 7 8 9]:D:[1 2 3] [3 ...
- 2020-12-13:用最少数量的线程,每个线程执行for的空循环,把cpu打满了。如果在for的空循环里添加打印输出函数,会把cpu打满吗?为什么?
福哥答案2020-12-13:不会.输出会进行io操作,相对于CPU的速度,这是一个非常缓慢的过程,所以CPU会有机会空闲下来.***[评论](https://user.qzone.qq.com/31 ...
- 2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角(
2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角( ...
- 2021-06-21:贩卖机只支持硬币支付,且收退都只支持10 ,50,100三种面额。一次购买只能出一瓶可乐,且投钱和找零都遵循优先使用大钱的原则,需要购买的可乐数量是m, 其中手头拥有的10、50
2021-06-21:贩卖机只支持硬币支付,且收退都只支持10 ,50,100三种面额.一次购买只能出一瓶可乐,且投钱和找零都遵循优先使用大钱的原则,需要购买的可乐数量是m, 其中手头拥有的10.50 ...
- vue工程内下载路由
一.路由Router Vue Router 是Vue.js官方的路由管理器.它和Vue.js的核心深度集成,加速构建单页面应用.包含功能有: 1 嵌套的路由/视图表 2 模块化的.基于组件的路由配置 ...
- mysql字段添加中文提示Data too long
解决方法: 新建一个数据库,字符集选择utf8
- 【QCustomPlot】性能提升之修改源码(版本 V2.x.x)
说明 使用 QCustomPlot 绘图库的过程中,有时候觉得原生的功能不太够用,比如它没有曲线平滑功能:有时候又觉得更新绘图数据时逐个赋值效率太低,如果能直接操作内存就好了:还有时候希望减轻 CPU ...
- java中单例模式 如何使用
引用: 原文链接:https://blog.csdn.net/qq_41458550/article/details/109243456
- Java 新的生态,Solon v2.3.2 发布
Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...
- Java革命性ORM框架之快速上手的Jimmer
Jimmer是一款革命性的ORM框架,它的目标是提供一个简单易用的API,帮助开发人员更加轻松地操作数据库.Jimmer使用了Java 8的新特性,如Lambda表达式和Stream API,使得代码 ...