level1
跟着题目做即可
level2
晃眼看好像和第一题一样,运行server又不正确,看了几遍题目,问了DS明白了这是要我用上socket套接字。当前的汇编代码只是调用了 exit(0),需要修改它,使其调用 socket() 系统调用来创建一个套接字。
1 | .intel_syntax noprefix |
mov rdi, 2:- 将
2赋值给rdi寄存器。rdi是系统调用的第一个参数寄存器,2表示AF_INET(IPv4 协议族)。
- 将
mov rsi, 1:- 将
1赋值给rsi寄存器。rsi是系统调用的第二个参数寄存器,1表示SOCK_STREAM(TCP 套接字类型)。
- 将
mov rdx, 0:- 将
0赋值给rdx寄存器。rdx是系统调用的第三个参数寄存器,0表示默认协议。
- 将
mov rax, 41:
执行系统调用后会自动生成TCP套接字。
- 将 `41` 赋值给 `rax` 寄存器。`rax` 是系统调用号寄存器,`41` 是 `socket()` 系统调用的系统调用号。
当然,创建一个 TCP 套接字只是进行完整的TCP通信的第一步。
level3
将一个地址绑定到套接字(In this challenge you will bind an address to a socket.)
继续在原有代码上进行增添:
1 | .intel_syntax noprefix |
lea是 Load Effective Address 指令,用于计算地址并将其加载到寄存器中。[rip+sockaddr]表示sockaddr结构体的地址相对于当前指令指针(rip)的偏移量。
- 设置参数:
- 将套接字文件描述符(
3)赋值给rdi。 - 将
sockaddr结构体的地址赋值给rsi。 - 将
sockaddr结构体的大小(16)赋值给rdx。 - 将
bind()的系统调用号(0x31)赋值给rax。
- 将套接字文件描述符(
- 执行系统调用:
- 调用
syscall,执行bind()系统调用。 - 操作系统会将
sockaddr中的地址信息绑定到套接字。
- 调用
level4
监听端口(In this challenge you will listen on a socket.)
1 | .intel_syntax noprefix |
backlog设置为零会导致操作系统拒绝所有连接请求。通常应设置为正整数。
不过接受请求在下一个level里。
level5
接受连接(In this challenge you will accept a connection.)
1 | .intel_syntax noprefix |
level6
静态响应http请求(In this challenge you will respond to an http request.)
copyright
copyright_text
本文链接:https://afogsheep-github-io.pages.dev2025/02/28/OLD_building_web_server_record/