网络攻防技术实验,实验环境、实验说明、实验代码见 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)对①-②处的代码进行解释
原始代码
按代码执行顺序而非从上至下的顺序:
- call one :将函数one压入栈中,再跳转到函数one
- db ‘xxxx’ :构建由命令、分隔符、占位符构成的字符串
- pop :将栈中最顶层的值(2中字符串)pop出并装入ebx中
- xor eax, eax :通过异或将eax置0
- mov [ebx+7], al :把2中字符串的*的位置替换为%0,用于截断
- mov [ebx+8], ebx :把命令”/bin/sh”的地址赋给占位符AAAA
- mov [ebx+12], eax :把BBBB赋值为NULL
- Lea :把命令”/bin/sh”的地址赋给ecx
- xor edx, edx :把edx置为NULL
- mov al 0x0b :把execve系统调用号作为参数传入
- 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 - 博客园文章来源:https://www.toymoban.com/news/detail-412064.html
linux 下env命令介绍 - 墨天轮文章来源地址https://www.toymoban.com/news/detail-412064.html
到了这里,关于网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!