Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [bits 64]
- section .data align=32
- fail:
- db "NO"
- db 0x0d,0x0a
- fail_len equ $ - fail
- confirm_1:
- db "HTB{"
- confirm_1_len equ $ - confirm_1
- confirm_2:
- db "}"
- db 0x0d,0x0a
- confirm_2_len equ $ - confirm_2
- colon: db ':'
- matrix_expected:
- ; 8x8 column order matrix_result for verification
- dw 11115,10925,9595,10830,10450,9215,10355,9595
- dw 5265,5175,4545,5130,4950,4365,4905,4545
- dw 7137,7015,6161,6954,6710,5917,6649,6161
- dw 3744,3680,3232,3648,3520,3104,3488,3232
- dw 3744,3680,3232,3648,3520,3104,3488,3232
- dw 7137,7015,6161,6954,6710,5917,6649,6161
- dw 5265,5175,4545,5130,4950,4365,4905,4545
- dw 11115,10925,9595,10830,10450,9215,10355,9595
- username_hash:
- db 'username'
- username_hash_len equ $ - username_hash
- db 'src @ p-bin '
- ;===============================================================
- section .bss align=32
- matrix_l:
- ; 8x8 column order matrix_result for password
- resb 64
- matrix_u:
- ; 8x8 row order matrix_result for username
- resb 64
- matrix_result:
- ; 8x8 row order matrix_result for username
- resb 64
- ;===============================================================
- section .text align=32
- global _start
- ;--------------------------------------------------------
- ;
- ; Count the number of bytes in RDI up to a NUL terminator
- ;
- ; Result in ecx
- ;
- lenstr:
- xor ecx,ecx
- not ecx ; counter = maxint
- xor eax,eax ; search for 0
- cld
- repne scasb ; scan edi for al
- not ecx
- dec ecx ; ecx is length of [rdi]
- ret
- _start:
- cld ; always fwd scans
- mov eax,[rsp] ; argc
- cmp eax, 3 ; 3 args ?
- jl exit_bad
- ;.................................
- lea rsi,[rsp+8] ; argv
- ;.................................
- mov rdi,[rsi+8] ; argv[1]
- push rdi
- call lenstr ; [rdi].length => ecx
- ;................................
- cmp rcx, username_hash_len ; bad username length ?
- jne exit_bad
- pop rdi
- push rcx ; need length later
- ;................................
- push rdi
- mov rsi, dword username_hash
- repe cmpsb
- pop rsi ; argv[1]
- pop rcx ; not affect flags
- jnz exit_bad ; username no match
- ;................................
- mov rdi, dword matrix_l
- rep movsb
- ;................................
- lea rsi,[rsp+8] ; argv
- mov rdi,[rsi+16] ; argv[2]
- push rdi
- call lenstr ; [rdi].length => ecx
- pop rsi
- mov rdi, dword matrix_u
- rep movsb
- ;................................
- call matmul
- mov rsi, dword matrix_result
- mov rdi, dword matrix_expected
- mov ecx,64
- repe cmpsw
- jnz exit_bad ; username no match
- ;-------------------------------------------
- exit_ok:
- xor rdi,rdi
- inc rdi
- mov rsi, dword confirm_1 ; msg to print
- mov rdx, confirm_1_len ; num chars
- xor eax,eax
- inc eax ; print (opcode = 1)
- syscall
- mov rsi, dword matrix_l ; msg to print
- mov rdx, 8 ; num chars
- xor eax,eax
- inc eax ; print (opcode = 1)
- syscall
- mov rsi, dword colon ; msg to print
- xor eax,eax
- inc eax
- mov rdx,rax ; print (opcode = 1)
- syscall
- mov rsi, dword matrix_u ; msg to print
- mov rdx, 8 ; num chars
- xor eax,eax
- inc eax ; print (opcode = 1)
- syscall
- mov rsi, dword confirm_2 ; msg to print
- mov rdx, confirm_2_len ; num chars
- xor eax,eax
- inc eax ; print (opcode = 1)
- syscall
- xor rdi,rdi ; return code = 0
- exit_code:
- mov eax,0x3c ; exit
- syscall
- exit_bad:
- xor rdi,rdi
- inc rdi
- inc rdi ; stderr
- mov rsi, dword fail ; msg
- mov rdx, fail_len ; num chars
- xor eax,eax
- inc eax ; print (opcode = 1)
- syscall
- xor rdi,rdi
- not rdi
- jmp exit_code
- ;--------------------------------------------------------
- ;
- ; Matrix multiply of matrix 8x8 bytes
- ; to matrix of 8x8 words
- ;
- ; Result in matrix L
- ;
- matmul:
- mov r10, dword matrix_result + 64*2
- xor eax,eax ; for mul make sure hiwords are zero
- mov r8, 7
- matmul_loop_1:
- mov r9, 7
- matmul_loop_2:
- xor edx,edx
- lea rsi, [matrix_l-1 + r9 ]
- lea rdi, [matrix_u-8 + r8 ]
- mov ecx, 8
- matmul_loop_3:
- mov al, [rsi+rcx] ; row start + col num
- mul byte [rdi+rcx*8] ; col start + row num x 8
- add edx,eax
- loop matmul_loop_3
- dec r10
- dec r10
- mov [r10], dx
- dec r9
- jns matmul_loop_2
- dec r8
- jns matmul_loop_1
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement