Assembly/gdb: 添加行为

Assembly/gdb: add behavior

虽然 运行 使用 GDB 的 ELF 程序,但我目前正在目睹特定添加指令的相当意外的行为:

英特尔语法:add cl,BYTE PTR [eax]

AT&T 语法:add (%eax),%cl

我希望这条指令与 gdb 的 set $cl=$cl+*((char*) $eax) 具有相同的含义(无论触发标志如何)。但是对于某个调试会话(见下文),行为是不一样的:(char) *$eax 的值为 0xb8,$cl 的值为 0,但是 $cl 的结果值为 0xcc.

我的问题是:这个0xcc是从哪里来的?为什么结果不是 0xb8?

该程序只是另一个可以找到的 crackme 程序 here

为了回答 Jester 下面的评论,以下 gdb 会话按预期工作:

(gdb) b *0x08048119
Breakpoint 1 at 0x8048119
(gdb) r
Starting program: /tmp/ch20.bin
Welcome to Root-Me Challenges
Pass: foo

Breakpoint 1, 0x08048119 in ?? ()
(gdb) x/i $eip
=> 0x8048119:   add    (%eax),%cl
(gdb) x/bx $eax
0x8048080:      0xb8
(gdb) p/x $cl
 = 0x0
(gdb) si
0x0804811b in ?? ()
(gdb) p/x $cl
 = 0xb8

但我不明白为什么下面的结果不一样:

(gdb) b *0x8048080
Breakpoint 1 at 0x8048080
(gdb) r
Starting program: /home/baz1/Downloads/ch20.bin 

Breakpoint 1, 0x08048080 in ?? ()
(gdb) ni
0x08048085 in ?? ()
(gdb) 
0x0804808a in ?? ()
(gdb) 
0x0804808f in ?? ()
(gdb) 
0x08048094 in ?? ()
(gdb) 
Welcome to Root-Me Challenges
Pass: 0x08048096 in ?? ()
(gdb) 
0x0804809b in ?? ()
(gdb) 
0x0804809d in ?? ()
(gdb) 
0x080480a2 in ?? ()
(gdb) 
0x080480a7 in ?? ()
(gdb) 

0x080480a9 in ?? ()
(gdb) 
0x080480ab in ?? ()
(gdb) 
0x080480b0 in ?? ()
(gdb) 
0x080480b5 in ?? ()
(gdb) 
0x08048115 in ?? ()
(gdb) 
0x08048117 in ?? ()
(gdb) 
0x08048119 in ?? ()
(gdb) x/i $eip
=> 0x8048119:   add    (%eax),%cl
(gdb) x/bx $eax
0x8048080:  0xb8
(gdb) p/x $cl
 = 0x0
(gdb) si
0x0804811b in ?? ()
(gdb) p/x $cl
 = 0xcc

非常感谢您的帮助。

b *0x8048080 将软件断点放入内存中,恰好是带有操作码 0xccint3 指令。然后 add 指令将读取此内容而不是原始内存内容。您可以在命中断点后删除断点或使用不修改代码的硬件断点。