最近遇到一个使用aarch64_be-gcc编译的ssh服务器出现不能通过ssh1协议使用密钥+passphrase不能正常登陆的问题。

(⊙o⊙)…不要奇怪为啥还在用SSH1,我也在奇怪。。

一顿捣鼓(重现问题),发现是64位的ssh-keygen生成的密钥的不能使用设置passphrase解密,于是问题就好办了,用x86_64的ssh-keygen生成一个密钥使用,ok,正常登陆了。

那么问题就结束了嘛,当然没有,怎么也得看一下为啥arm64的ssh-keygen就不正常了。

于是编译一个debug版本,去掉-O3优化,aarch64_be-gcc的-O3优化相当crazy,已经给我造成成吨的伤害了。。。

调试发现:

 Breakpoint 5, sshkey_private_rsa1_to_blob (key=0x556955a610,
blob=0x556955ad60, passphrase=0x556955ac20 "123456",
comment=0x7fffffc758 "root@trait") at sshkey.c:3474
3474 sshkey.c: No such file or directory.
(gdb) p cp
$10 = (u_char *) 0x556955aaa0 ">*"
(gdb) n
3482 in sshkey.c
(gdb) p cp
$11 = (u_char *) 0x556955aaa0 ">*>*"
(gdb) n
3483 in sshkey.c
(gdb) n
3482 in sshkey.c
(gdb) n
3484 in sshkey.c
(gdb) n
3483 in sshkey.c
(gdb) n
3485 in sshkey.c
(gdb) n
3484 in sshkey.c
(gdb) n Breakpoint 6, sshkey_private_rsa1_to_blob (key=0x556955a610,
blob=0x556955ad60, passphrase=0x556955ac20 "123456",
comment=0x7fffffc758 "trait@trait") at sshkey.c:3489
3489 in sshkey.c
(gdb) p cp
$12 = (u_char *) 0x556955aaa0 ""
(gdb) p buf
$13 = "\000\000\000UiU\255`"
(gdb) n
3490 in sshkey.c
(gdb) p buf
$14 = "\000\000\000\000\000\000\000"
(gdb) p cp
$15 = (u_char *) 0x556955aaa0 ""
(gdb) bt
#0 sshkey_private_rsa1_to_blob (key=0x556955a610, blob=0x556955ad60,
passphrase=0x556955ac20 "123456", comment=0x7fffffc758 "trait@trait")
at sshkey.c:3490
#1 0x00000055694fef48 in sshkey_private_to_fileblob (key=0x556955a610,
blob=0x556955ad60, passphrase=0x556955ac20 "123456",
comment=<optimized out>, force_new_format=<optimized out>,
new_format_cipher=<optimized out>, new_format_rounds=<optimized out>)
at sshkey.c:3610
#2 0x0000005569505024 in sshkey_save_private (key=0x556955a610,
filename=0x5569553168 <identity_file> "testpass1",
passphrase=0x556955ac20 "123456", comment=0x7fffffc758 "trait@trait",
force_new_format=0, new_format_cipher=0x0, new_format_rounds=0)
at authfile.c:85
#3 0x00000055694f6f30 in main (argc=<optimized out>, argv=0x3d4)
at ssh-keygen.c:2672

发现cp这个变量变成空字符串了,这里openssh的代码我就不分析了,因为我也没这么读,完全是因为这个三不管的ssh服务出问题了。

这么就变成空的了呢。。。

在X86的虚拟机上面也调试了一下:

 Breakpoint 1, sshkey_private_rsa1_to_blob (key=0x17c658, blob=0x17eaf8, passphrase=0x17ee20 "123456", comment=0xbffff139 "trait@trait")
at sshkey.c:3449
3449 {
(gdb) b sshkey.c:3490
Breakpoint 2 at 0x11dbea: file sshkey.c, line 3490.
(gdb) c
Continuing. Breakpoint 2, sshkey_private_rsa1_to_blob (key=0x17c658, blob=0x17eaf8, passphrase=0x17ee20 "123456", comment=0xbffff139 "trait@trait")
at sshkey.c:3490
3490 if ((r = sshbuf_put(buffer, buf, 8 - (sshbuf_len(buffer) % 8))) != 0)
(gdb) p cp
$1 = (u_char *) 0x17eb28 "\310\065\327\267\310\065\327\267 \353\027"
(gdb) bt
#0 sshkey_private_rsa1_to_blob (key=0x17c658, blob=0x17eaf8, passphrase=0x17ee20 "123456", comment=0xbffff139 "trait@trait") at sshkey.c:3490
#1 0x001244a5 in sshkey_private_to_fileblob (key=0x17c658, blob=0x17eaf8, passphrase=0x17ee20 "123456", comment=0xbffff139 "trait@trait",
force_new_format=0, new_format_cipher=0x0, new_format_rounds=0) at sshkey.c:3610
#2 0x0012d250 in sshkey_save_private (key=0x17c658, filename=0x17a0e0 "testpass", passphrase=0x17ee20 "123456", comment=0xbffff139 "trait@trait",
force_new_format=0, new_format_cipher=0x0, new_format_rounds=0) at authfile.c:85
#3 0x0011be51 in main (argc=1398664, argv=0xbffff618) at ssh-keygen.c:2672 Breakpoint 1, sshkey_private_rsa1_to_blob (key=0x17c658, blob=0x17eaf8, passphrase=0x17ee20 "123456", comment=0xbffff139 "trait@trait")
at sshkey.c:3449
3449 {
(gdb) b sshbuf.c:350
Breakpoint 3 at 0x11c9e5: file sshbuf.c, line 350.
(gdb) c
Continuing.

同样的代码,不同的结果,好吧

继续调试arm64的版本:

 Breakpoint 9, sshbuf_reserve (buf=0x5584d5c2e0, len=258, dpp=0x7fffffba60)
at sshbuf.c:347
347 in sshbuf.c
(gdb) p (u_char *) 0x5584d5baa0
$36 = (u_char *) 0x5584d5baa0 "\322\316\322\316"
(gdb) n
348 in sshbuf.c
(gdb) n
350 in sshbuf.c
(gdb) p (u_char *) 0x5584d5baa0
$37 = (u_char *) 0x5584d5baa0 "\322\316\322\316"
(gdb) n
356 in sshbuf.c
(gdb) p (u_char *) 0x5584d5baa0
$38 = (u_char *) 0x5584d5baa0 ""
(gdb) p rlen
$39 = 512
(gdb) p buf->d
$40 = (u_char *) 0x5584d5baa0 ""
(gdb) p dp
$41 = (u_char *) 0x5584d5cf70 "\322\316\322\316"

上面的cp指针与buf->d是同一个地址。openssh6.9p1 代码如下:

 if ((dp = realloc(buf->d, rlen)) == NULL) {
SSHBUF_DBG(("realloc fail"));
if (dpp != NULL)
*dpp = NULL;
return SSH_ERR_ALLOC_FAIL;
}

发现buf->d拷贝给了dp,但是自己内容被清空了,于是查看realloc的说明,只有一种情况貌似符合这种情况,就是buf->d指向的内存区域被移动了,这会是谁干的?realloc???

realloc在aarch64_be-gcc的奇怪表现的更多相关文章

  1. jQuery toggle方法的一个奇怪表现。

    function buildTree() { //$('.tree li:has(ul)').addClass('parent_li').find(' > span').attr('title' ...

  2. JS与Jquery学习笔记(一)

    一. Javascript的作用域,大坑! 1. JS作用域奇怪表现之一:预编译 在其他的语言里我们如果使用一个变量在声明其之前,是会报错的,但是在js里面却不一定,比如: function f1() ...

  3. css 用direction来改变元素水平方向,价值研究。

    "direction"有两个值:ltr | rtl ltr:从左往右 rtl:从右往左 默认:ltr 一起看个效果就懂了. <style> div{ direction ...

  4. 深入理解javascript 中的 delete(转)

    在这篇文章中作者从<JavaScript面向对象编程指南>一书中关于 delete 的错误讲起,详细讲述了关于 delete 操作的实现, 局限以及在不同浏览器和插件(这里指 firebu ...

  5. CSS浏览器兼容的那些事儿

    1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白1px,下留白3px,op ...

  6. 浏览器的不兼容,归纳几点html编码要素

    1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白1px,下留白3px,op ...

  7. javascript之delete操作符

    理解delete 理论 代码段的类型 执行上下文 活动对象 / 变量对象 属性的特性 内置属性与 DontDelete 未声明的赋值 Firebug的困惑 在eval中删除变量 浏览器兼容性 Geck ...

  8. esnext:Function.prototype.toString 终于有规范了

    从 ES1 到 ES5 的这 14 年时间里,Function.prototype.toString 的规范一字未变: An implementation-dependent representati ...

  9. 谈谈 TCP 的 TIME_WAIT

    由来 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O.机器性能外,还考虑到了网络协议的问 ...

随机推荐

  1. 第39章 ETH—Lwip以太网通信—零死角玩转STM32-F429系列

    第39章     ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  2. 第1章-如何使用本书—零死角玩转STM32-F429系列

    第1章    如何使用本书 1.1    本书的参考资料 集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com ...

  3. ADO.net中常用的对象有哪些?

    ADO.net中常用的对象有哪些?分别描述一下. 答:Connection 数据库连接对像 Command 数据库命令 DataReader 数据读取器 DataSet 数据集 DataReader与 ...

  4. Subversion简介

    作为一名编程人员,SVN经常作为代码.项目的版本控制,殊不知SVN也可作为其他领域的版本控制,例如对文档.音频.视频等 . SVN可以看成一种文件系统,为了使工作人员提高工作效率,可以进行并行的工作, ...

  5. 03-UI控件浏览

    UI控件浏览 可能用得上的UI控件 为了便于开发者打造各式各样的优秀app,UIKit框架提供了非常多功能强大又易用的UI控件 下面列举一些在开发中可能用得上的UI控件(红色表明最常用,蓝色代表一般, ...

  6. mpvue重构小程序之坑点1

    对于最近刚做的项目,想着用框架重新架构一遍,方便以后拓展,毕竟现在拓展方向非常大. 目前主要碰到两个略坑的问题: 1: 关于用户授权信息的按钮,原生是以下方式,使用bindgetuserinfo事件 ...

  7. 获取Grid后台动态添加的子项

    例:Grid的子项是包含边框的复选框CheckBox //遍历Grid中的子项 foreach (var c in this.grid_box.Children) { Border bd = c as ...

  8. kali安装ssh服务

    一. kali安装ssh服务 1.修改源 root@DGG:~# vi /etc/apt/sources.list deb http://http.kali.org/kali kali-rolling ...

  9. 动态代理和AOP

    之前说过了我对IOC的理解,这篇文章说以下我对动态代理和基本的对AOP的理解. 所谓动态代理就是,在运行时,动态创建实现了一组指定接口的实现类对象. 比如有: interface A { } inte ...

  10. 使用file_get_contents()和curl()抓取网络资源的效率对比

    使用file_get_contents()和curl()抓取网络资源的效率对比 在将小程序用户头像合成海报的时候,用到了抓取用户头像对应的网络资源,那么抓取方式有很多,比如 file_get_cont ...