首页
社区
课程
招聘
[求助]一个关于爆破的迷惑了很久的问题
2006-4-20 12:55 4631

[求助]一个关于爆破的迷惑了很久的问题

2006-4-20 12:55
4631
我们常见的爆破的方法就是修改关键的跳转,例如将jne改为je或者改为nop之类的.如果按照我们通常的逻辑上的理解,上面的方法很正确,不过最近由于真正开始学习汇编的缘故,感到了迷茫.

我们知道跳转指令到底是否要跳转是根据标志位来的,比如je到底要不要跳转那要看决定它跳转的标志位的值.那么我们将其改变之后,比如将其改为jne,控制jne跳转的还是要看标志位的值,而我们又并没有修改标志位的值,这样修改之后能成功吗?

有时候好象成功了,那到底为什么成功了呢?如果不能成功,我们又应该怎么修改呢?

一只想学习的鸟热切的期待高手的回答.先在此谢了!

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
乌鸦 2006-4-20 13:28
2
0
晕,一定的条件下,标志位结果肯定是不变的。

有jne改成je以后,原来相同条件下不发生的事情就变成要发生了,这不就解决问题了吗。

不成功的可能性只可能有一个,你没有找到那个关键的jne(或je)。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
firecho 2006-4-20 14:23
3
0
晕,楼上给出的是正解,楼主学晕了吧
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2006-4-20 21:47
4
0
如果以 C 语言的角度来看

if( a == 10)
   printf( "大家好" );

我们输入的序号是错误的,所以 a 的值永远都是 1 至 9,所以我们看不见 “大家好” 这句

但是,我们用工具把程序修改成

if( a!= 10)
   printf( "大家好" );

现在,我们依然输入错误的序号, a 的值依旧是 1 至 9,可是上面的程序会顺利给我们  “大家好”,因为检查的条件被我们反转了

实际程序里,CPU标志位的值,是根据检查条件的结果来变化的,如果 a 的值是 10,那么  if( a == 10) 这句执行后, CPU 的 ZF标志便会是 true,否则是 false
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
正在堕落 2006-4-21 14:01
5
0
不好意思,自己学晕了,谢谢大家的回答.呵呵!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cjlove 2006-4-24 12:13
6
0
1 2 3 4
1+2跳转到3 比如说是 注册码错误`
1+3跳转到4 比如说算 注册成功
你把2 3 比做 jne je
那你想要那个结果就自己选咯`
它的跳转自然也就成了对比
PS:好像自己也陷入进去了
你尽可能理解吧`我也满菜的..
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cjlove 2006-4-24 12:22
7
0
还有NOP 你尽可能理解他就是一个结果
不需要任何过程得到的结果 就是4`
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
baibai 2006-4-28 20:17
8
0
很想解答,但是不知道从什么地方说起
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SeaHome 2006-4-29 02:24
9
0
最初由 riijj 发布
如果以 C 语言的角度来看

if( a == 10)
printf( "大家好" );

........


riijj的意思就是当je变成jnz时,标志位是会变的?
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
wangshq397 8 2006-4-29 11:07
10
0
标志位决定跳转跳还是不跳,相同的标志位,je跳,jne就不跳,其他同理。
游客
登录 | 注册 方可回帖
返回