首页 > 解决方案 > 为什么当我在 GDB 中单步执行缓冲区溢出时,我的 CC INT3 指令不执行任何操作?

问题描述

我正在做 protostar 漏洞利用练习#5。

基本上这是代码,目标是将代码执行重定向到您的 shellcode。我的问题只是涉及为什么我的指令没有执行。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

这是一个缓冲区溢出问题。我已经成功地将返回地址重定向到我的 nop 雪橇的开头,然后是 int3 "\xcc" shellcode,它阻止程序执行(只是为了检查它是否会执行)

"\x90\x90\x90\x90\xcc\xcc\xcc\xcc"

基本上,当我穿过我的 nop 雪橇时,它只是说

0xbffff7a2 in ?? ()
(gdb)
0xbffff7a3 in ?? ()
(gdb)
0xbffff7a4 in ?? ()
(gdb)

请记住,我成功地将代码执行重定向到这些地址,并且我检查了这些地址分别是“\x90”和“\xcc”。但什么也没有发生。该程序甚至没有收到来自“\xcc”的中断。

我可能没有提供足够的信息,但本质上它应该执行这些指令,但似乎没有。

我想可能是指令需要字节对齐?但这还重要吗?

我只想知道为什么即使您指向该地址也可能无法执行指令的某些原因。

This is x86 Architecture machine. 

标签: assemblyx86gdbbuffer-overflow

解决方案


gdb 在内部使用 int3 这就是为什么你看不到任何效果。您应该告诉它忽略 SIGTRAP 信号并将其传递给进程。

(gdb) handle SIGTRAP nostop noprint pass
SIGTRAP is used by the debugger.
Are you sure you want to change it? (y or n) y

Signal        Stop      Print   Pass to program Description
SIGTRAP       No        No      Yes             Trace/breakpoint trap

(gdb) si

Program terminated with signal SIGTRAP, Trace/breakpoint trap.
The program no longer exists.

由于您尝试仅将其用于检测用户模式下的代码执行,因此请考虑使用其他会导致错误的指令,例如HLT. 这不会干扰调试器操作,因此您无需更改信号处理。


推荐阅读