免責聲明:我使用Ubuntu-12.04和gcc-4.8.-2和gdb-7.7.1調試器。
我在調試器下執行程序,直到我輸入了check
並單步到了if。然後我拆解的代碼,並期待在大會:
(gdb) disass
Dump of assembler code for function check:
0x000000000040062d <+0>: push %rbp
0x000000000040062e <+1>: mov %rsp,%rbp
0x0000000000400631 <+4>: sub $0x10,%rsp
=> 0x0000000000400635 <+8>: cmpl $0x0,-0x4(%rbp)
0x0000000000400639 <+12>: je 0x400647 <check+26>
0x000000000040063b <+14>: mov $0x400754,%edi
0x0000000000400640 <+19>: callq 0x4004e0 <[email protected]>
0x0000000000400645 <+24>: jmp 0x400651 <check+36>
0x0000000000400647 <+26>: mov $0x400766,%edi
0x000000000040064c <+31>: callq 0x4004e0 <[email protected]>
0x0000000000400651 <+36>: leaveq
而且我看了一下我的寄存器(只顯示了重要的)值:
(gdb) info reg
rbp 0x7fffffffdf00 0x7fffffffdf00
rsp 0x7fffffffdef0 0x7fffffffdef0
rip 0x400635 0x400635 <check+8>
eflags 0x206 [ PF IF ]
接下來,我單論指令(gdb) ni
踩反覆拆卸和獲得的eflags
值:
(gdb) disass
Dump of assembler code for function check:
0x000000000040062d <+0>: push %rbp
0x000000000040062e <+1>: mov %rsp,%rbp
0x0000000000400631 <+4>: sub $0x10,%rsp
0x0000000000400635 <+8>: cmpl $0x0,-0x4(%rbp)
=> 0x0000000000400639 <+12>: je 0x400647 <check+26>
0x000000000040063b <+14>: mov $0x400754,%edi
0x0000000000400640 <+19>: callq 0x4004e0 <[email protected]>
0x0000000000400645 <+24>: jmp 0x400651 <check+36>
0x0000000000400647 <+26>: mov $0x400766,%edi
0x000000000040064c <+31>: callq 0x4004e0 <[email protected]>
0x0000000000400651 <+36>: leaveq
0x0000000000400652 <+37>: retq
End of assembler dump.
(gdb) info reg
eflags 0x206 [ PF IF ]
回想一下,cmp
的工作方式是SIMU根據需要設置相應的減法,這就是je
然後使用的。所以這段代碼將執行從0減去-0x4(%rpb)(設置零標誌爲approprate)。如果數字相同,jz將跳轉。
所以我改性用命令序列標誌寄存器:
(gdb) set $ZF = 6
(gdb) set $eflags |= (1 << $ZF)
(gdb) print $eflags
$1 = [ PF ZF IF ]
注意,零標誌現在設置。單指令集(ni
),並採取看看拆解:
(gdb) ni
(gdb) disass
Dump of assembler code for function check:
0x000000000040062d <+0>: push %rbp
0x000000000040062e <+1>: mov %rsp,%rbp
0x0000000000400631 <+4>: sub $0x10,%rsp
0x0000000000400635 <+8>: cmpl $0x0,-0x4(%rbp)
0x0000000000400639 <+12>: je 0x400647 <check+26>
0x000000000040063b <+14>: mov $0x400754,%edi
0x0000000000400640 <+19>: callq 0x4004e0 <[email protected]>
0x0000000000400645 <+24>: jmp 0x400651 <check+36>
=> 0x0000000000400647 <+26>: mov $0x400766,%edi
0x000000000040064c <+31>: callq 0x4004e0 <[email protected]>
0x0000000000400651 <+36>: leaveq
0x0000000000400652 <+37>: retq
End of assembler dump.
這是在別的塊,你應該得到顯示的標誌。 (請注意在我的測試程序中,我註釋掉了該標誌)。
在哪裏/如何設置無效?我看到它被用在'check'函數中,我看不到它是如何設置的。 – thurizas
我不確定。其實我也對這一點感到困惑。我沒有寫這個代碼。我得到了這個代碼。當我運行它時,它要求輸入密碼才能訪問標誌內容。我不知道密碼,所以現在我必須找到一些利用/後門來猜測密碼才能訪問標誌。我似乎無法找到任何利用。 – sar
如果你可以調試程序,你應該可以修改比較。例如,invalid是一個局部變量,因此存儲在堆棧中。在測試之前,你應該能夠改變它的價值。 – thurizas