弦歌雅意的小屋

  • 首页

  • 分类

  • 归档

strstr不是indexOf

发表于 2022-04-20 | 更新于 2022-04-26 | 分类于 随笔

strstr不是indexOf

strstr是C语言中查找字符子串的函数。

1
char* strstr(const char *pstr, const char* pstrSearch);

indexOf是现代语言中常见的查找子字符串的函数。

1
int indexOf(strSearch);

indexOf返回的是子字符串索引位置,strstr返回的是找到的字串的地址指针。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *buf = malloc(256);
//操作buf
...

char * key= "searchKey";

//bug产生的地方
int idx = strstr(buf, key);
if(idx > 0){
buf[idx] = '\0';
}

//显示buf内容
...

上述代码以使用indexOf的方式使用strstr,导致想截断字符串时数组越界。最终导致嵌入式设备电流从7ma骤然增加到40ma。

这里截断出错后,其实字符串的显示和预期不同。但这里造成bug的代码过于简单,反而导致找错了方向,浪费了不少时间。

小程序上传文件nginx返回404原因排查

发表于 2022-04-20 | 更新于 2022-04-25 | 分类于 随笔

小程序上传文件nginx返回404原因排查

现象描述

微信小程序上传图片功能,服务端时ngnix代理到netty后端。开发工具使用iphone模拟器上传文件正常。但是iPhone手机测试返回404.
android手机测试OK。

故障排查

404状态码表示地址不存在。

PC开发工具和android手机测试正常,iPhone手机返回404,地址是找的到的。

打开nginx访问日志

1
2
x.x.x.x - - [18/Mar/2022:04:11:49 +0000] "POST /upload HTTP/2.0" 404 154 "https://servicewechat.com/wx0000000/0/page-frame.html" "Mozilla/5.0 (iPhone; CPU iPhone OS 15_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.16(0x18001023) NetType/4G Language/zh_CN" "-"
x.x.x.x - - [18/Apr/2022:10:04:44 +0000] "POST /upload HTTP/1.1" 200 103 "https://servicewechat.com/wx0000000/0/page-frame.html" "Mozilla/5.0 (Linux; Android 11; KB2000 Build/RP1A.201005.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/4207 MMWEBSDK/20220303 Mobile Safari/537.36 MMWEBID/4095 MicroMessenger/8.0.21.2120(0x28001553) Process/appbrand1 WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android" "-"

这里显示iPhone用的时HTTP/2.0协议,难道是后端netty不支持HTTP/2.0协议导致的?

netty 是其他人负责的,不能修改。那就在nginx中删除对HTTP/2.0的支持。测试后iPhone设备测试仍返回404.

迷茫中…

过了一天,另一台android设备测试也返回404,这就不单单是iPhone的问题了。

1
x.x.x.x - - [24/Mar/2022:06:49:24 +0000] "POST /upload HTTP/1.1" 404 556 "https://servicewechat.com/wx0000000/0/page-frame.html" "Mozilla/5.0 (Linux; Android 9; ARS-AL00 Build/HUAWEIARS-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/3195 MMWEBSDK/20220204 Mobile Safari/537.36 MMWEBID/8978 MicroMessenger/8.0.20.2100(0x28001451) Process/appbrand0 WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android" "-"

这台nginx是用docker容器运行的,没有配置error.log.
配置error.log, 再次测试后查看error.log.

1
2
3
2022/03/24 07:14:37 [error] 12#12: *6 open() "/usr/share/nginx/html/50x.html" failed (2: No such file or directory), cli
ent: x.x.x.x, server: gw.xxx.com, request: "POST /upload HTTP/2.0", upstream: "http://172.17.0.1:8088/upload"
, host: "gw.xxx.com"

这里显示nginx找不到50x.html文件。

看来是upload请求时netty返回50x状态码,这时nginx查找50x.html返回给客户端,但是nginx没有配置50x.html为文件,然后nginx转而返回404状态码给客户端,导致真正的50x状态码丢失。

真相

Netty默认配置对上传文件有64k的限制。所以测试时如果上传的图片小于64k,则流程一切正常。当上传图片大于64k时,netty出错,返回50x错误(这里没有确认核对具体返回码)。如果正确的配置了nginx,那么这时nginx就会返回netty返回的状态码,页面内容为50x.html的内容。
但是这台运行在docker中的nginx配置不够完整,没有配置error.log和50x.html界面,结果倒置nginx无法找到50x.html文件,导致返回404错误码,掩盖了真正错误的原因。

C语言开发的几个小经验总结

发表于 2022-04-16 | 更新于 2022-04-25 | 分类于 随笔

C语言开发的几个小经验总结

选择正确的整数数据类型

优先选择有符号整数

32位无符号整数的范围为0-2的32次方-1。
32为符号整数的范围为-2的31次方-2的31次方-1。
这里面的陷阱在于减法操作。

1
2
3
4
5
6
uint32_t a = 0;

if(a - 1 < 0){
//代码不会进入这里
....
}

这里a为无符号整数,a-1的结果会转化为无符号整数。

当然正确的做法是不使用默认类型转换。但人总有打盹的时候是不?

谨慎使用bool类型

新的C语言标准中是由bool类型的,编译器也有专有支持。

这里的问题是bool类型表现出一定的整数特性。

1
2
3
4
5
6
7
bool status = false;

status += 1; // status 为true

status += 1; // status 为true

status == 2 //false, 这时status的值仍为1

bool的实现,编译器会有差异。所以这里代码可能和你的编译结果不一样。

这里容易出错的地方有二:

  • 变量名没有数据类型的暗示,可能改为b_status会好很多.
  • 变量开始是两个值,后期需要支持三个值。
函数参数谨慎使用bool类型

函数参数有bool这类较窄的数据时,调用函数时提供完整的函数声明。
建议优先使用字长参数。

提供完整的函数声明

C语言调用函数时不需要提供函数声明,只要link时能找到同名符号就可以link成功。
首先不提供函数声明是不好的习惯。
因为没有正确的函数声明,编译器编译代码时会根据调用函数时提供的参数来生成参数入栈代码。这时候因为参数类型推断错误导致代码运行时失败。前面提到到函数参数使用bool类型就可能会导致这种问题。

sscanf直接返回到结构体导致数据溢出

1
2
3
4
5
6
7
8
9
10
11
typedef struct {
short a,
short b,
char c,
int d;
} T;

T t;
char *str = get_str();
sscanf(str, "%d", &(t.d));
sscanf(str, "%c", &(t.c)); //这里sscanf读出的内容为int类型,导致成员d的前三个字节被覆盖。

sscanf函数建议先读到临时变量中,再给struct结构成员赋值。

结语

上述经验只是最近参与开发的项目中遇到的比较隐蔽的问题。平时养成良好的编码习惯,上面的问题基本都能避免。

旁路攻击的现实生活例子

发表于 2022-02-18 | 更新于 2022-04-25 | 分类于 随笔

旁路攻击的现实生活例子

旁路攻击是密码学中的一个术语,是对加密算法的一种攻击方法。这种攻击通过研究密码运行过程中产生出的一些物理学、化学等现象来破解加密算法。这些现象包括热量、声光电磁信号等。

针对现在计算机加密算法的旁路攻击,一般需要专业工具和方法,一般普通人难以理解。这里举一些生活中的例子,让大家有个感性的认识。

  • 电影中的开保险柜

    不知道密码是无法打开保险柜的。但是保险柜的旋钮在旋转到正确的位置时,保险柜内部会有轻微的震动,窃贼就是通过侦听保险柜运转过程中外部信号,来实现对保险柜的旁路攻击。

  • ATM金属按键

    ATM使用金属按键就是为了更快的散热。这样在用户输过密码后,按过的按键的温度,迅速恢复到按之前的状态。这里通过扫描按键的温度来猜测密码,就可以理解为旁路攻击。

    分析密码锁的按键的赃物程度、油脂痕迹来获取密码信息,也算是类似的旁路攻击。

    ​

PowerSell学习笔记

发表于 2022-02-17 | 更新于 2022-04-25 | 分类于 PowerShell

PowerShell学习笔记

现在使用Win10操作系统,PowerShell版本是5.0。考虑做一些脚本给非程序员用户使用,所以学习了一些PowerShell知识。

现在PowerShell的最新版本为7.0,但是考虑到普通用户的便利性,这里基本主要介绍能在5.0版本上运行的知识。

这里主要记录实践中的一些知识点,不是学习教程。

  • 引号的区别

单引号中字符串是字面字符串。双引号中字符串会对内容进行一些解析,如替换变量、代码转义。

  • 转义字符

    PowerShell的转义字符为” ` “, Esc按键下面的按键。转义字符需要用双引号,单引号中无效。

    换行(`n)、退格(`b) 等

  • 用UTF8编码输出内容到文件

    1
    Out-File -FilePath "out.txt" -Encoding utf8

    ​

  • 控制屏幕字符串

    创建控制字符例子

    1
    regex :Unescape("123`n456\u001b100DAB\u001bK")

    创建unicode字符

    1
    [char]0x0048

    ​

    控制台控制字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    \x1b[0m   关闭所有属性  
    \x1b[1m 设置高亮度
    \x1b[4m 下划线
    \x1b[5m 闪烁
    \x1b[7m 反显
    \x1b[8m 消隐
    \x1b[30m -- \x1b[37m 设置前景色
    \x1b[40m -- \x1b[47m 设置背景色
    \x1b[nA 光标上移n行
    \x1b[nB 光标下移n行
    \x1b[nC 光标右移n行
    \x1b[nD 光标左移n行
    \x1b[y;xH 设置光标位置
    \x1b[2J 清屏
    \x1b[K 清除从光标到行尾的内容
    \x1b[s 保存光标位置
    \x1b[u 恢复光标位置
    \x1b[?25l 隐藏光标
    \x1b[?25h 显示光标

    \x1b[2J\x1b[0;0H 清屏且将光标置顶

    ​

  • ​

Locus Map 3.38.0+版本修改

发表于 2019-07-25 | 更新于 2019-07-29 | 分类于 逆向工程

Locus Map 3.38.0+版本修改

从3.38.0版本开始,Locus最低支持Andorid版本为 5.0。

Android 5.0版本开始,系统再启动App时会先把所有的dex加载进来,无需再把启动时要用到的class放在第一个dex文件中。

阅读全文 »

银行卡号校验规则

发表于 2019-07-21 | 更新于 2019-07-26 | 分类于 随笔

银行卡号校验规则

昨天写了身份证编号的校验规则,今天顺便写下银行卡的校验规则。

常见的输入类信息都有校验规则,方便检查用户输入,银行卡号码也不例外,也特别需要,毕竟是一长串无规则数字,记忆和输入难免出错。

阅读全文 »

火车票上身份证信息的安全性

发表于 2019-07-20 | 更新于 2019-07-26 | 分类于 随笔

火车票上身份证信息的安全性

现在坐火车时,火车票上都打印了身份证信息,不过身份证信息中生日信息都是被屏蔽了。
我们知道身份证中的18位数字中前6位为地区编码,7-14为生日信息,15-17位为出生地生日当天身份证顺序编号,最后一位数字为校验位,允许值位0-9加X(罗马数字10)

校验位的作用是判断身份证是否输错的一个验证机制。

因为校验机制的存在,缩减了身份证信息的取值范围。

那么我们是否可以猜测出火车票上身份证信息中的隐藏的生日信息,从而完整还原乘车人身份证信息。

阅读全文 »

ffmpeg常见命令整理

发表于 2019-07-16 | 更新于 2019-07-17 | 分类于 ffmpeg

ffmpeg常见命令整理

视频输入流为:desktop
视频输入流格式:gdigrab

//列出麦克风和摄像头信息

1
ffmpeg -list_devices true -f dshow -i dummy

//录制30秒视频

1
ffmpeg -f gdigrab -s 1920x1080 -t 30 -i /dev/video0 -vcodec libx264 -f mp4 out.mp4

//win10 ffmpeg获取桌面和麦克风

1
ffmpeg -f gdigrab -i desktop -f dshow -i audio="@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{EEFED86D-1A2A-45E9-95D1-C7DF1BC9211F}" -vcodec libx264 -qp 20 -acodec libvo_aacenc test_desktop_microphone.mp4

//linux 录制屏幕和摄像头(摄像头叠加在屏幕上右下角)和麦克风

1
ffmpeg -thread_queue_size 96 -f x11grab -video_size 1920x1080 -i :0.0 -f video4linux2 -video_size 400x300  -i /dev/video0  -filter_complex '[0:v][1:v]overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10[out]' -map '[out]'  test_desktop_camera_microphone.mp4

//linux录制摄像头和麦克风

1
ffmpeg -f alsa -ac 2 -ar 44100 -i pulse  -f video4linux2 -framerate 30 -i /dev/video0 -framerate 30 -vcodec libx264 -acodec ac3 test_camera_microphone.mp4

推流

1
ffmpeg.exe -re -i ..\..\16.mkv -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/live/home

拉流

1
ffplay.exe -fs rtmp://localhost:1935/live/home1

参加Intel 2019-07-11 AIDC 深圳站活动

发表于 2019-07-11 | 更新于 2019-07-12 | 分类于 人工智能

参加Intel 2019-07-11 AIDC 深圳站活动

今天有幸参加了Intel 2019 AIDC深圳站的活动。恰好7月11日,正好和7-11重名。

讲座介绍了Intel在AI生态上的布局,主要是推理芯片。毕竟目前训练芯片还是NV的天下,但是在应用领域x86云算力没有那么大,且特别是边缘计算,X86结构还是有优势的。

阅读全文 »
12…8
Erik Lu

Erik Lu

从事软件开发多年
目前致力于移动开发
平时喜欢逆向工程
现在学习人工智能中
擅长Java、Swift、Python、Javascript
喜爱Linux Shell
72 日志
19 分类
71 标签
GitHub
© 2014 – 2022 Erik Lu
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Pisces v7.1.2