我正在使用GDB调试应用程序。 有一个字符串比较然后跳跃(JNS):
0x8048410 <main+32>: call 0x8058a70
0x8048415 <main+37>: add esp,0x10
0x8048418 <main+40>: test eax,eax
0x804841a <main+42>: jns 0x8048436 <main+70>
测试指令后的堆栈状态如下:
EFLAGS: 0x286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
大写字母表示标志已激活。 GDB Peda说自从SIGN标志被激活后才进行跳转,至少这是我对JNS指令的理解,跳转到NO SIGN。
我想按照跳转指令,所以我关闭了标志:
set $SF = 7
set $eflags &= ~(1 << $SF)
你可以看到SIGN标志被禁用:
EFLAGS: 0x206 (carry PARITY adjust zero sign trap INTERRUPT direction overflow)
但是gdp peda仍然说没有采取跳跃,而当我实际尝试跳跃时,它不会跳跃。 我对JNS指令的理解是问题还是我错过了其他的东西?
编辑:不知道为什么但是在更改标志后跳转确实有效,但是peda不理解这个改变并且仍然说不会跳转。在写答案之前,我会再检查一下。