【问题标题】:How to store null bytes into memory address with strcpy如何使用 strcpy 将空字节存储到内存地址中
【发布时间】:2021-02-28 14:45:32
【问题描述】:

对于大学的安全课程,我需要通过仅数据漏洞执行 shell。

c 代码包含一个 strcpy() 语句,所以我可以用某个缓冲区的内存地址覆盖一个结构。假设这个缓冲区分配在0xbfffecfc

我需要通过命令行在这个缓冲区地址输入值 1 (0x00000001)。这通过 strcpy() 函数直接写入0xbfffecfc

我已经试过了 python -c 'print "\x01\x00\x00\x00" 但这不起作用,因为\x00 字节终止了输入。

如何将这个值 1 放入缓冲区?

【问题讨论】:

  • 你不能使用strcpy,它用于NUL终止的字符串。你可能需要memcpy 虽然我不太确定你在问什么;也许你应该展示你提到的那段代码。
  • 不,strcpy() 永远不会写入超过一个值为0 的单个字节。从不。
  • 是的,我明白了,但是是否有另一种方法可以通过 strcpy() 在该内存地址中获取 0x00000001?也许要添加除 \x00 之外的另一个值,这不会将 1 的值更改为地址?
  • 你不能通过一次调用strcpy()来完成,但你可以多次调用,每次写入最终缓冲区的一部分。
  • strcpy(0xbfffecfc, ""); strcpy(0xbfffecfd, ""); strcpy(0xbfffecfe, ""); strcpy(0xbfffecff, "");

标签: c shell security command-line


【解决方案1】:

strcpy 用于复制字符串,这些字符串是字符序列,其结尾标有空字符。因此,它不能复制超出第一个空字符。

memcpy 用于复制任意长度的字节序列。

要复制"\0x01\0x00\0x00\0x00",它表示具有little-endian 字节顺序的四字节1,请使用memcpy(destination, "\0x01\0x00\0x00\0x00", 4);

要在本机表示中复制值为 1 的 int,请使用 memcpy(destination, (int []) { 1 }, sizeof 1);

【讨论】:

  • 过早的(和不必要的(和迂腐的))优化:用memcpy(destination, "\0x01\0x00\0x00", 4);保存1个字节
  • @pmg: 嗯,没错,但我想知道它会让多少人停下来,尽管它是正确的。
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多