我們都用慣了圖形介面的od啥的,但是假如我們要除錯一台伺服器上的程式
我們想要改變程式執行流程,除了修改二進位制程式中的二進位制,還可以臨時改變一下標誌位,臨時改變執行流程
命令就是我們經常用到的 set
我們首先看看暫存器
(gdb) i r
eax 0x804b008 134524936
ecx 0x4 4
edx 0xbffff748 -1073744056
ebx 0x2a8ff4 2789364
esp 0xbffff760 0xbffff760
ebp 0xbffff778 0xbffff778
esi 0x804b008 134524936
edi 0x80486e9 134514409
eip 0x804842c 0x804842c eflags 0x246 [ pf zf if ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
發現標記暫存器也在上面,加入我們將zf置為0,那怎麼辦呢,
先將上面的值轉化為2進製,修改從右邊開始數第7位的值為0就可以了
>>> bin(0x246)
'0b1001000110'
>>> hex(0b1000000110)
'0x206'
那我們設定為0x206看看
(gdb) set $eflags=0x206
(gdb) i r
eax 0x804b008 134524936
ecx 0x4 4
edx 0xbffff748 -1073744056
ebx 0x2a8ff4 2789364
esp 0xbffff760 0xbffff760
ebp 0xbffff778 0xbffff778
esi 0x804b008 134524936
edi 0x80486e9 134514409
eip 0x804842c 0x804842c eflags 0x206 [ pf if ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
果然去掉了zf標誌位
看下圖就知道了
參考中南大學的乙個課件:
標誌位的位運算應用
今天設計新版標誌位,老郭提出了乙個新的方案。以往都是乙個字段設定乙個狀態,tinyint型別,0或者1,但是這樣的壞處是如果乙個資訊表有很多狀態,需要增加很多的字段,空間利用不好,所以他提出用二進位制位運算來解決標示位的問題。設定標示位字段位tinyint型別,也就是最大128,換成二進位制就是有8...
各種標誌位的含義
進製標誌cf主要用來反映運算是否產生進製或借位。如果運算結果的最高位產生了乙個進製或借位,那麼,其值為1,否則其值為0。使用該標誌位的情況有 多字 位元組 數的加減運算,無符號數的大小比較運算,移位操作,字 位元組 之間移位,專門改變cf值的指令等。奇偶標誌pf用於反映運算結果中 1 的個數的奇偶性...
常見的標誌暫存器FLAG的標誌位
進製標誌cf主要用來反映運算是否產生進製或借位。如果運算結果的最高位產生了乙個進製或借位,那麼,其值為1,否則其值為0。使用該標誌位的情況有 多字 位元組 數的加減運算,無符號數的大小比較運算,移位操作,字 位元組 之間移位,專門改變cf值的指令等。奇偶標誌pf用於反映運算結果中 1 的個數的奇偶性...