gdb修改標誌位的值

2021-07-28 03:21:50 字數 1751 閱讀 5935

我們都用慣了圖形介面的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 的個數的奇偶性...