我不知道为什么代码在 gdb 中以这种方式流动
I don't know why codes flow this way in gdb
我正在调试二进制文件 (vortex8)。该程序使用 pthread_create() 函数运行两个线程。汇编代码如下。
(gdb) 0xbffffa01 in ?? ()
(gdb) x/i 0xbffff9fd
0xbffff9fd: nop
0xbffff9fe: jmp 0xbffffa0d
0xbffffa00: pop ebx
0xbffffa01: add ebx,0xb
0xbffffa04: mov eax,0x804a010 // address of fflush@got
0xbffffa09: mov DWORD PTR [eax],ebx // fflush@got change
0xbffffa0b: jmp 0xbffffa12
0xbffffa0d: call 0xbffffa00
...
0xbffffa1b: xor eax,eax
0xbffffa1d: push eax
0xbffffa1e: push 0x68732f2f
0xbffffa23: push 0x6e69622f
0xbffffa28: mov ebx,esp
0xbffffa2a: push eax
0xbffffa2b: push ebx
0xbffffa2c: mov ecx,esp
0xbffffa2e: mov al,0xb
0xbffffa30: xor edx,edx
0xbffffa32: int 0x80
(gdb) b * safecode + 40
(gdb) ni
[Switching to Thread 0xb7df8b40 (LWP 17523)]
Breakpoint 5, 0x08048685 in safecode ()
=> 0x8048685 <safecode+40>: call 0x80484d0 <fflush@plt>
0x804868a <safecode+45>: mov DWORD PTR [esp],0x1
0x8048691 <safecode+52>: call 0x80484e0 <sleep@plt>
0x8048696 <safecode+57>: jmp 0x804866a <safecode+13>
0x8048698 <unsafecode> : push ebp
(gdb) si
0x80484d0 <fflush@plt>: jmp DWORD PTR ds:0x804a010
(gdb) ni
0xbffffa1b : xor eax, eax
0xbffffa1d: push eax
0xbffffa1e: push 0x68732f2f
0xbffffa23: push 0x6e69622f
0xbffffa28: loopne 0xbffff9ae
我不知道为什么先换线程'ni'。
在第一个 'ni' 中,fflush@got 没有更改,因为线程更改发生在执行 '0xbffffa09' 之前。但是,线程改变后,fflush@got 改变了,所以 fflush@got 的值是 0xbffffa1b 我想改变的。此外,更改了 0xbffffa1b 之后的代码。为什么?
您缺少一些信息,例如注册表值。异常发生在 0xbffffa01
处,它也不包含在您的输出中。大概是这次跳转的结果:
0xbffff9fd: nop
0xbffff9fe: jmp 0xbffffa0d
我建议通过将 nop
(0x90) 更改为 int 3
(0xCC) 或在 gdb
中设置断点,然后单步执行代码,在 0xbffff9fd
处放置一个断点逐个指令查看崩溃前发生的情况。
我正在调试二进制文件 (vortex8)。该程序使用 pthread_create() 函数运行两个线程。汇编代码如下。
(gdb) 0xbffffa01 in ?? ()
(gdb) x/i 0xbffff9fd
0xbffff9fd: nop
0xbffff9fe: jmp 0xbffffa0d
0xbffffa00: pop ebx
0xbffffa01: add ebx,0xb
0xbffffa04: mov eax,0x804a010 // address of fflush@got
0xbffffa09: mov DWORD PTR [eax],ebx // fflush@got change
0xbffffa0b: jmp 0xbffffa12
0xbffffa0d: call 0xbffffa00
...
0xbffffa1b: xor eax,eax
0xbffffa1d: push eax
0xbffffa1e: push 0x68732f2f
0xbffffa23: push 0x6e69622f
0xbffffa28: mov ebx,esp
0xbffffa2a: push eax
0xbffffa2b: push ebx
0xbffffa2c: mov ecx,esp
0xbffffa2e: mov al,0xb
0xbffffa30: xor edx,edx
0xbffffa32: int 0x80
(gdb) b * safecode + 40
(gdb) ni
[Switching to Thread 0xb7df8b40 (LWP 17523)]
Breakpoint 5, 0x08048685 in safecode ()
=> 0x8048685 <safecode+40>: call 0x80484d0 <fflush@plt>
0x804868a <safecode+45>: mov DWORD PTR [esp],0x1
0x8048691 <safecode+52>: call 0x80484e0 <sleep@plt>
0x8048696 <safecode+57>: jmp 0x804866a <safecode+13>
0x8048698 <unsafecode> : push ebp
(gdb) si
0x80484d0 <fflush@plt>: jmp DWORD PTR ds:0x804a010
(gdb) ni
0xbffffa1b : xor eax, eax
0xbffffa1d: push eax
0xbffffa1e: push 0x68732f2f
0xbffffa23: push 0x6e69622f
0xbffffa28: loopne 0xbffff9ae
我不知道为什么先换线程'ni'。 在第一个 'ni' 中,fflush@got 没有更改,因为线程更改发生在执行 '0xbffffa09' 之前。但是,线程改变后,fflush@got 改变了,所以 fflush@got 的值是 0xbffffa1b 我想改变的。此外,更改了 0xbffffa1b 之后的代码。为什么?
您缺少一些信息,例如注册表值。异常发生在 0xbffffa01
处,它也不包含在您的输出中。大概是这次跳转的结果:
0xbffff9fd: nop
0xbffff9fe: jmp 0xbffffa0d
我建议通过将 nop
(0x90) 更改为 int 3
(0xCC) 或在 gdb
中设置断点,然后单步执行代码,在 0xbffff9fd
处放置一个断点逐个指令查看崩溃前发生的情况。