Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 需要使用程序集将用户Id从客户端发送到服务器的帮助吗_Linux_Assembly_Nasm_System Calls_Uid - Fatal编程技术网

Linux 需要使用程序集将用户Id从客户端发送到服务器的帮助吗

Linux 需要使用程序集将用户Id从客户端发送到服务器的帮助吗,linux,assembly,nasm,system-calls,uid,Linux,Assembly,Nasm,System Calls,Uid,我对汇编相当陌生,正在尝试创建一个客户端,它将连接到服务器并传递用户id。我使用getuid系统调用。 我也尝试过直接在客户机中打印,但也不起作用 global _start struc sockaddr_in .sin_family resw 1 .sin_port resw 1 .sin_addr resd 1 .sin_zero resb 8 endstruc ; Convert numbers (constants!) to network byte

我对汇编相当陌生,正在尝试创建一个客户端,它将连接到服务器并传递用户id。我使用getuid系统调用。 我也尝试过直接在客户机中打印,但也不起作用

global _start

struc sockaddr_in
    .sin_family resw 1
    .sin_port resw 1
    .sin_addr resd 1
    .sin_zero resb 8
endstruc

; Convert numbers (constants!) to network byte order
%define hton(x) ((x & 0xFF000000) >> 24) | ((x & 0x00FF0000) >>  8) | ((x & 0x0000FF00) <<  8) | ((x & 0x000000FF) << 24)
%define htons(x) ((x >> 8) & 0xFF) | ((x & 0xFF) << 8)

AF_INET        equ 2
SOCK_STREAM    equ 1
INADDR_ANY  equ 0   ; /usr/include/linux/in.h

STDIN          equ 0
STDOUT         equ 1

__NR_exit   equ 1
__NR_read       equ 3
__NR_write      equ 4
__NR_close  equ 6
__NR_socketcall equ 102
__NR_getuid equ 24

; commands for sys_socketcall
; /usr/include/linux/in.h
SYS_SOCKET  equ 1
SYS_BIND    equ 2
SYS_CONNECT equ 3
SYS_LISTEN  equ 4
SYS_ACCEPT  equ 5
SYS_SEND    equ 9
SYS_RECV    equ 10
;------------------------


_ip equ 0x7F000001      ; loopback - 127.0.0.1
_port equ 31337

; Convert 'em to network byte order
IP equ hton(_ip)
PORT equ htons(_port)

BUFLEN         equ  1000

section .data

my_sa istruc sockaddr_in
    at sockaddr_in.sin_family, dw AF_INET
    at sockaddr_in.sin_port, dw PORT
    at sockaddr_in.sin_addr, dd INADDR_ANY
    at sockaddr_in.sin_zero, dd 0, 0
iend

socket_args dd AF_INET, SOCK_STREAM, 0
connect_args dd 0, my_sa, sockaddr_in_size

section .bss
    my_buf resb BUFLEN
    fd_socket resd 1
    fd_conn resd 1
    id resd 1

section .text
 _start: 

    ; socket(AF_INET, SOCK_STREAM, 0)
    mov ecx, socket_args    ; address of args structure
    mov ebx, SYS_SOCKET     ; subfunction or "command"
    mov eax, __NR_socketcall     ;c.f. /usr/src/linux/net/socket.c
    int 80h

    cmp eax, -4096
    ja exit

    mov [fd_socket], eax
    ; and fill in connect_args, etc.
    mov [connect_args], eax    

    mov ecx, connect_args
    mov ebx, SYS_CONNECT    ; subfunction or "command"
    mov eax, __NR_socketcall
    int 80h

    cmp eax, -4096
    ja exit

    mov [fd_conn], eax    

    xor eax, eax

    ; call getuid()
    mov eax, __NR_getuid
    int 80h

    cmp eax, -4096
    ja exit    

    ;mov eax, '3'
    mov [id], eax

    ; write(sock, buf, len)
    mov edx, 4          ; arg 3: max count
    mov ecx, id         ; arg 2: buffer
    mov ebx, [fd_socket]    ; arg 1: fd
    mov eax, __NR_write     ; sys_write
    int 80h

    cmp eax, -4096
    ja exit


goodexit:
    xor eax, eax        ; success
 exit:
    mov ebx, eax        ; exitcode
    neg ebx
    mov eax, __NR_exit
    int 80h
;-----------------------
global\u启动
struc sockaddr_in
.sin_家庭报告1
.sin_port resw 1
.sinu addr resd 1
.sinu zero resb 8
端部结构
; 将数字(常数!)转换为网络字节顺序

%定义hton(x)((x&0xFF000000)>>24)|((x&0x00FF0000)>>8)|((x&0x0000FF00)8)&0xFF)|((x&0xFF)您必须将UID转换为字符串,并将其存储在
id
中。看起来您正在发送一个原始整数。当您将
'3'
移动到
id
时,您正在发送字母
3
的ASCII代码,因此它可以工作。如果您希望
UID
转换为文本,则必须在转换之前自己完成结束它。可能您的服务器正在获取数据,但您没有处理不可打印的字符。您可以发送
id
的原始二进制值,但在显示之前,您必须将其转换为服务器端的字符串。@MichaelPetch所以基本上我必须在汇编中复制一种sprintf行为。您能给出一些提示吗或者告诉我在哪里可以学着这么做?谢谢你的回复