网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)

发布于:2022-11-27 ⋅ 阅读:(322) ⋅ 点赞:(0)

网络攻防技术实验,实验环境、实验说明、实验代码见 Shellcode Development Lab

Task 1: Writing Shellcode

a: The Entire Process

1)编译mysh.s得到二进制文件

2)执行1)中的二进制文件,结果如下图,我们看到运行mysh之前的PID与运行mysh之后的PID是不同的,证明我们通过mysh启动了一个新的shell。

3)获取机器码,以便进一步提取shellcode所需要的二进制机器码,如下图所示。

4)使用xxd命令打印出二进制文件的内容,从打印输出中找到shell的机器码,由3)可知机器码的起始和结尾分别为31c0、cd80,因此截取二者之间的内容,并将内容复制到convert.py中。

 截取

 替换

5)执行convert.py文件,得到shellcode中包含的16进制形式的机器码如下:

b: Eliminating Zeros from the Code

1)task里给的操作如下图。但我们不允许添加额外的,机器码中不能出现0我的理解是,汇编码里不能出现类似push “”的操作,因此考虑其他构造方法。

2)我们参考前文中对0的处理,将”h####为占位符赋值给ebx,然后左移24bit,右移24bit,让”h###”变为”h%0%0%0”,其他部分原理不变。

 前文中的处理

 修改mysh

3)运行并查看机器码,发现更改有效且不存在%0

 运行发现成功

 查看机器码

 查看机器码,无%0

c: Providing Arguments for System Calls

1) 修改mysh,将/bin/sh -c "ls -la"压入栈中,通过#占位和左右移的方式来引入空格。

 修改后的mysh

2)编译并执行mysh-c直接在命令行中输入“ls -la”,观察到二者结果相同。

 执行mysh-c

 命令行直接执行ls -la

3)查看mysh.o的二进制机器码,发现没有0。

 mysh十六进制机器码

Task 2: Using Code Segment

1)对①-②处的代码进行解释

 原始代码

按代码执行顺序而非从上至下的顺序:

  1. call one                   :将函数one压入栈中,再跳转到函数one
  2. db ‘xxxx’                  :构建由命令、分隔符、占位符构成的字符串
  3. pop                          :将栈中最顶层的值2中字符串pop装入ebx中
  4. xor eax, eax            :通过异或将eax置0
  5. mov [ebx+7], al       :把2中字符串的*的位置替换为%0,用于截断
  6. mov [ebx+8], ebx    :把命令”/bin/sh”的地址赋给占位符AAAA
  7. mov [ebx+12], eax  :把BBBB赋值为NULL
  8. Lea                          :把命令”/bin/sh”的地址赋给ecx
  9. xor edx, edx            :把edx置为NULL
  10. mov al 0x0b            :把execve系统调用号作为参数传入
  11. Int 0x80                  :调用128号中断

最终,mysh2.s可用c语言总结为:

        char *command[] = {"/bin/sh", NULL};

        execve(command[0], command, NULL);

2)env用于打印环境变量,env后加“-”表示参数选项,因此构造字符串“/usr/bin/env - a=11 b=22”

 3)构造字符串并在mysh2.s基础上进行修改。

思路和mysh2.s一致,先将用%0替代分割位来截断,再将地址赋值给占位符,最后对寄存器进行处理,构造的命令为 /usr/bin/env - a=11 b=11,最终构造的字符串为'/usr/bin/env*-*a=11*b=22*AAAABBBBCCCCDDDDEEEE',其中*是分隔符,后续会通过mov [esi+x], al操作被赋予0,AAAABBBBCCCCDDDDEEEE是占位符,分别填充四个子命令的地址和最后一个传递给execve的参数NULL。

section .text
  global _start
    _start:
        BITS 32
	    jmp short two
    one:
 	    pop esi
     	xor eax, eax
 	
 	    mov [esi+12], al   ; /usr/bin/env%0
 	    mov [esi+14], al   ; -%0
 	    mov [esi+19], al   ; a=11%0
 	    mov [esi+24], al   ; b=22%0
 	
 	    mov [esi+25], esi  ; address of /usr/bin/env in AAAA
 	
 	    lea ebx, [esi+13]  ; get address of -
 	    mov [esi+29], ebx  ; address of - in BBBB
 	
 	    lea ebx, [esi+15]  ; get address of a=11
 	    mov [esi+33], ebx  ; address of a=11 in CCCC
 	
 	    lea ebx, [esi+20]  ; get address of b=22
 	    mov [esi+37], ebx  ; address of b=22 in DDDD
 	    
 	    mov [esi+41], eax  ; put NULL in EEEE
 	
 	    mov al,  0x0b      ; pass the execve syscall number as argument
 	    mov ebx, esi
 	    lea ecx, [esi+25]  ; /usr/bin/env - a=11 b=22
 	    lea edx, [esi+41]  ; NULL

 	    int 0x80           ; execve
    two:
 	    call one
 	    db '/usr/bin/env*-*a=11*b=22*AAAABBBBCCCCDDDDEEEE' 

 最终,修改后的mysh2.s可用c语言总结为:

        char *command[] = {"/usr/bin/env", "-", "a=11", "b=22" NULL};

        execve(command[0], command, NULL);

4)编译并执行

 如果忘加--omagic会出现segmentation fault,--omagic选项使代码段可写。

Task 3: Writing 64-bit Shellcode

1)参考b: Eliminating Zeros from the Code中左右移位将占位符替换为%0的操作修改mysh_64,代码如下:

 2)编译并运行,发现成功。

参考资料:

Shellcode Development Lab

使用netcat进行反弹链接的shellcode - xxxxxxxx1x2xxxxxxx - 博客园

用汇编语言构造简单的shellcode(64位&&32位)以及将汇编语言转换成机器码的方法 - ZikH26 - 博客园

linux 下env命令介绍 - 墨天轮


网站公告

今日签到

点亮在社区的每一天
去签到