linux - 获取系统(主机)名称的程序集/Shellcode

标签 linux assembly x86 shellcode

因此,对于学校的类(class),我们试图找到一个汇编代码来查找系统主机名(即在终端中运行“hostname”或“uname -n”时打印出的内容)。

但是经过大量谷歌搜索后,我们陷入了困境。问题是,代码随后将转换为 shellcode,但对于我们尝试过的所有版本,它都会导致段错误。通常我们会编写一个小的C程序,对其进行汇编,然后使用gdb将其写入shellcode。

我们总是会遇到段错误。

那么,对于如何尽可能简单地通过程序集查找系统主机名有什么建议吗? (通过 VirtualBox 运行 Ubuntu x86)

其次,有什么想法可以对当前的 shellcode 进行错误检查,从而导致段错误吗? (启用从堆栈运行可执行代码)

非常感谢您遇到任何问题!

最佳答案

“new uname”系统调用返回以下结构:

#define __NEW_UTS_LEN 64

struct new_utsname {
        char sysname[__NEW_UTS_LEN + 1];
        char nodename[__NEW_UTS_LEN + 1];
        char release[__NEW_UTS_LEN + 1];
        char version[__NEW_UTS_LEN + 1];
        char machine[__NEW_UTS_LEN + 1];
        char domainname[__NEW_UTS_LEN + 1];
};

这意味着我们需要为结构分配至少 390 个字节,并且 nodename 从偏移量 65 开始。在 32 位 Linux 上,uname 系统调用是 #122。因此,独立代码可能如下所示:

xor %eax, %eax              # eax=0
sub $122, %eax              # eax=-sys_uname
lea (%esp, %eax, 4), %esp   # allocate buffer
neg %eax                    # fix sign of sys_uname
mov %esp, %ebx              # address of the buffer
int $0x80                   # syscall
mov $4, %al                 # sys_write (assume eax==0)
lea -3(%eax), %ebx          # stdout (1)
lea 65(%esp), %ecx          # address of nodename
lea 60(%eax), %edx          # length (do strlen if you want)
int $0x80                   # syscall
mov $1, %al                 # sys_exit
int $0x80                   # syscall

这将打印整个节点名称,因此包括一堆尾随零(通常不可见)。确定确切的字符串长度作为练习;)

这是位置无关(并且零字节空闲)代码,只需获取机器代码字节并将其复制到堆栈中就可以使其作为 shellcode 工作(假设如您所说的可执行堆栈):

void main()
{
    char code[] = {
        0x31, 0xc0, 0x83, 0xe8, 0x7a, 0x8d, 0x24, 0x84,
        0xf7, 0xd8, 0x89, 0xe3, 0xcd, 0x80, 0xb0, 0x04,
        0x8d, 0x58, 0xfd, 0x8d, 0x4c, 0x24, 0x41, 0x8d,
        0x50, 0x3c, 0xcd, 0x80, 0xb0, 0x01, 0xcd, 0x80 };
    ((void(*)())code)();
}

使用gcc -m32 -z execstack进行编译。

关于linux - 获取系统(主机)名称的程序集/Shellcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33977994/

相关文章:

linux - 接口(interface)、配置和端点是这些软件实体或硬件

linux - 如何在 Linux 中使用 1 个命令获取文件信息和 md5 校验和

assembly - IDA 专业版 : How to modify a function to always return true?

c - 如何在 x86 实模式非操作系统程序集中打印字符串

c - 地址和推送指令前的星号,它被推送到哪里?

linux - 检索 `ls -la` 的符号链接(symbolic link)和目标链接

c - 时间片是如何在进程中的 pthreads 之间划分的?

c - 舍入为整数 - 舍入控制字段?

assembly - 为什么我可以在寄存器中访问较低的 dword/word/byte 但不能访问较高的 dword/word/byte?

assembly - 汇编语言中的寻址模式 (IA-32 NASM)