USDT.transfer self-destruct? 非标准ERC20问题和解决方案

0x00 问题 最近在做智能合约开发,需要转出合约里的 USDT。在以太坊网络里,USDT 是 ERC20 Token, 调用以下函数: 得到如下报错信息: 0x01 原因 为啥转出报错了呢,看看 Etherscan 合约源码1,发现猫腻: 没有返回值!!这不是标准的 ERC20。 标准 ERC20 会返回 bool 值,以区分是否转账成功。智能合约可以根据返回值,对错误做处理,这样的好处是,即使 Token 转移失败,仍然允许交易成功。 而 USDT 转移操作失败时,直接回退交易,没有返回值。 0x02 深入分析 一番搜索后,找到这篇文章2 讲的很详细,有兴趣的看看原文。 原来,ERC20 标准制定的时候就两种方案讨论了很久: 有返回值:返回 bool 是否成功,让合约去做异常处理 没有返回值: 失败时 revert 以确保安全性 现在,这两种都被认为服从 ERC20 标准,但前者更常见,很大一部分原因是 2017/3/17~2017/8/13 这段时间 OpenZeppelin 实现了前者3,之后才改为后者。 由于 Solidity 的函数选择器只由 函数名和入参决定,如: 也就是和函数返回值没关,所以两种实现的 transfer 函数调用都没问题。 第一种实现没有返回值,函数声明有返回 bool […]

记一次APP加密算法逆向

上回写到成功抓到包了。请求参数如下,服务端有做验签,这次我们来试试逆向破解这个签名生成算法 下面记录了操作过程: apk反编译,得到java源码 搜索关键字 找到了加密算法,藏在so库里 在资源目录下找到libencrypt.so, 用IDA打开, 找到encryptHttpSignature函数 使用frida hook generateKey hmac_sha1 拿到 参数 拿到key, 逆向完成 参考: Frida Android hook frida_hook_libart

记一次APP SSL pinnig 抓包

先了解下背景,APP证书校验的几种实现方式[1]: 不校验,只走Https流量 系统信任证书校验 Android7以后,系统不再信任用户级的证书,只信任系统级的证书,所以要抓包就需要把我们的代理程序证书安装至Android的系统目录中 公钥校验Public Key Pinning HTTPS网站防止攻击者利用数字证书认证机构(CA)错误签发的证书进行中间人攻击的一种安全机制,用于预防CA遭受入侵或其他会造成CA签发未授权证书的情况。采用公钥固定时,网站会提供已授权公钥的哈希列表,指示客户端在后续通讯中只接受列表上的公钥。 证书全内容校验 SSL Certificate Pinning 下面记录了一次抓包过程: 打开Charles, 启用ssl proxy,手机配好代理,开始如图所示,提示握手失败 看来有做证书校验,试试第二种系统证书校验,把charles证书装到手机上 手工安装的证书,只能装到用户证书区 要装到系统证书,有以下几种方式 Xposed 模块,Android 10可以使用太极 JustTrustMe TrustMeAlready Magisk 模块 Always Trust User Certificates No luck, 尝试第3种 公钥校验,这里用到 frida(手机需root), 手机端, 参考 官方文档 下载frida-server对应架构版本 手机用数据线连接到电脑 把二进制执行文件复制到手机 /data/local/tmp/ 手工执行: /data/local/tmp/frida-server & 如果使用了Magisk, 需要关闭MagiskHide 电脑端 安装 pip3 install frida 使用脚本 frida-multiple-unpinning, 可以绕过多种实现的公钥 […]

记一次Mybatis缓存踩坑

接口结果和预期的不一致,在本地Debug,便有了以上的截图 为啥按id查出来的对象id为空? 为啥sql打印的结果 templateType为1,对象里确是 0? 一脸懵逼🤔️ 原来,同一个查询,查了会缓存,后面直接命中了缓存,不再查数据库 一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。 对返回对象的修改,同时也是对缓存的对象的修改😂 MyBatis一级缓存的生命周期和SqlSession一致。 MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起数据脏读。 每次执行update前会清空localCache。 对Mybatis缓存的分析,有兴趣的可以看看这篇文章 聊聊MyBatis缓存机制

终端下连接Wi-Fi

当ubuntu被搞坏了(显卡驱动啥的),可以在Recovery模式进入终端想办法修复,而此时如果需要用到apt安装新的软件包,如何在终端连接Wi-Fi网络呢? 可以使用 iw  命令连接未加密或WEP加密的网络: iw dev <devicename> connect [key 0:<password>] 而要连接现在最常用的WPA/WPA2网络操作起来比较复杂。 NetworkManager是检测网络、自动连接网络的程序。无论是无线还是有线连接,它都可以令您轻松管理。最初由 Redhat 公司开发,现在由 GNOME 管理。 nmcli 是NetworkManager的CLI工具。使用nmcli用户可以查询网络连接的状态,也可以用来管理,是一个很方便的配置网络的工具。 要连到一个WPA/WPA2的网络,首先选择设备 ,一般为 wifi 使用wifi搜索网络,可以看到很直观的可用网络列表,包括信号强度,加密方式等 nmcli dev wifi 使用以下命令即可连接: nmcli dev wifi connect <ssid> password <password> 更多用法,请查看手册。 man nmcli

Running In The Rain

四点半开始下大雨,机会来了,跑步去~ 下雨跑步,才不热到爆炸= = 反正跑完休息一下就洗澡,easy easy   今天还是有点猛烈:) 开始时狂风大作,不时伴随着入地闪电,跑着也有点心潮澎湃/哈哈 跑完二十圈还是没什么感觉,就一个字 爽~雨零星下,也就撤了     这是昨天听到的一首歌,一下子爱上,源自德国电影kokowaah(法国菜,红酒炖香鸡),马上看完,配乐质量都不错,赞 电影说的是家庭,喜剧片很搞笑很可爱,不错。   这几天开始练车,教练总叫我慢点,但是真受不了慢吞吞的>_< 现在想着,快又不加分,还增大犯错风险,想起RUSH极速风流的Niki Lauda.是要学着 慢 了。 总之还是挺好玩的。   晚上就没去看成破风,期待,明天再去看啦。