首页
社区
课程
招聘
[求助]求助,exe反汇编指令长度不够修改入门
发表于: 2015-7-8 15:48 6128

[求助]求助,exe反汇编指令长度不够修改入门

2015-7-8 15:48
6128
各位大大,你们好。
我又来叨扰各位了。

因为开发者离开未正常交接(称病,然后就联系不上了,未留下源代码),留下一DOS下的exe(16位程序,跑在一个586的工控卡上)。

需要对其中的一些参数进行修改,有这么一个地方。
mov ax,4        ;ax=4     B8 04 00
push ax          ;ax入栈    50
xor ax,ax        ;ax=0     33 C0
push ax          ;ax入栈    50
call IndInfo
add sp,4
功能就是类似C语言代码IndInfo(0,4){...},
将参数4和参数0传入后调用IndInfo。现在需要将参数0改成其他数值,比如1,那么肯定不能使用xor ax,ax(对应二进制码33 C0)命令了,需要使用mov ax,1(对应二进制码B8 01 00),
然而xor ax,ax的指令长度是2个字节(33 C0),mov ax,1的指令长度是3个字节(B8 01 00),
修改的办法,
1、只直接push一个4字节的数,该四字节数据排列刚好跟两次入栈4 1一样(还得要push4字节指令长度容得下),
2、在入栈之前jmp ,跳到一个新的安全的地址,该地址空间足够大,随便你折腾,折腾完了再跳回。

请问各位大大,
方法2中,如何获取一块新的安全的地址?

能不能使用上述例子将方法1和方法2演示一下?

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 299
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
如果你要修改ax值在255以内。就用也是2字节
MOV AL,02
2015-7-8 16:15
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
可以反汇编这个函数,一般函数开头或者结尾的地方,如果不是4字节对齐的话,会有编译器用0xcc填充,如果发现很多cc,cc,cc,cc连续出现很多字节的情况,那么这一块区域是可以使用的空白区域,jmp到这个地方,再把cc改为你自己的汇编语句就可以了。如果jmp偏移超过128字节,那么可以在128字节的空白区域在继续jmp,直到jmp到合适的空白区域为止。比如只有连续2个cc,cc,而连续10个cc,cc...的区域位于128字节以外,那么可以先jmp到连续2个cc的区域,再jmp到连续10个cc的区域。
2015-7-8 16:38
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
挖哈哈,果然,mov al,1的编码是B0 01.
非常感谢。。。

但是能否指点下  类似windows下修改前5个字节的jmp方法呢?   关键是不知道怎么找一个安全的空间。  在DOS下估计。是3个字节
2015-7-8 16:39
0
雪    币: 5
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
百度一下inline hook不都是jmp前5个字节吗?
2015-7-8 17:05
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
百度出来的inline hook5个字节是因为那是32位程序,jmp一个字节,后面跟一个地址(4字节),32位程序,地址就是32位。

我要改的exe是DOS下的,16位程序,地址是16位,jmp一个字节,地址2个字节,共3个字节
2015-7-8 17:56
0
雪    币: 44
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
jmp 跳到程序空白的地址
jmp 下条语句

序空白的地址:
XXX
XXX
XXX
XXX
jmp 跳回jmp 下条语句
2015-7-8 20:27
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大大,这个空白地址如何确定?  或者说大家一般使用哪里的空间的地址来做这个XXX呢?

直接在程序末尾添加若干字节,然后跳过来可以吗?  如果添加到程序末尾,这个地址应该怎样计算?
2015-7-8 20:58
0
雪    币: 44
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
一般是在程序的末尾,就是一堆不像代码的地方,或者是一堆的0。
地址怎么计算,这个就不清楚了。。因为我用od 反编译都有地址的。
2015-7-8 21:41
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
如果拿IDA里来说,
seg000:3020    mov ax,4    ;B8 04 00
seg000:3023    push ax      ;50
seg000:3024    xor ax,ax    ;33 C0
seg000:3026    push ax      ;50
seg000:3027    call IndInfo

我如果要改的话

seg000:3020    nop
seg000:3021    nop
seg000:3022    nop
seg000:3023    nop
seg000:3024    nop
seg000:3025    jmp short loc_3093    ;EB 6C
seg000:3027    call IndInfo

我在loc_3093处push几个我需要的参数,然后jmp short loc_3027就可以了

现在我把那个exe文件使用UltraEdit打开,定位到seg000:3020处(搜索特定HEX字符),把原代码使用nop和jmp填充,其中jmp(EB)后面跟的地址就是loc_3093(简单拿短跳做例,此处是6C),如何确定哪块位置我可以存放代码? dseg0000随便找个位置估计不行。而且,我如何在UltraEdit中定位loc_3093?
2015-7-8 21:44
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那个程序的末尾,一堆不像代码的地方有没有个学名什么的?  比如说数据段? 代码区?

关键是我需要知道,exe中,哪部分数据是不会被使用的,我可以放心的拿来用

在IDA中,程序末尾是类似dseg:4BD1    db 0FFh一堆的数据,这里我不能用啊,估计是全局变量啊
在dseg之前,是seg001:00A9  这里是程序的代码,也不能改啊

地址计算到是容易。就我LS举的例子,  3025 + 6C + 2 = 3093
2015-7-8 21:51
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢大大出手。

DOS下程序没有发现有4字节对齐的现象,最多不用的字节只有一个。估计DOS下不需要4字节对齐吧
2015-7-8 22:05
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
假如原exe是121个字节,我可不可以添加一定数量字节,比如40个,变成161字节长度,然后jmp到122字节处执行,执行完再跳回?

文件的PE头(DOS下不知道是不是也是PE结构)有没有那个地方会标记自身可执行代码最大地址为121  ,如果转跳到122处,会来个崩溃什么的?
2015-7-8 22:11
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
dos的exe 不是 pe结构

把你想要执行的代码添加在文件末尾,开头跳到此处,执行后再跳回去。
其实就是个补丁。
2015-7-9 08:02
0
游客
登录 | 注册 方可回帖
返回
//