gdb修改标志位的值

我们都用惯了图形界面的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 <main+60>
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 <main+60>
eflags         0x206	[ PF IF ]
cs             0x73	115
ss             0x7b	123
ds             0x7b	123
es             0x7b	123
fs             0x0	0
gs             0x33	51


果然去掉了ZF标志位


那怎么知道那个位在第几位呢


看下图就知道了



参考中南大学的一个课件:http://netclass.csu.edu.cn/NCourse/hep094/homepage/flags.htm

原文地址:https://www.cnblogs.com/cnsec/p/13286517.html