duangsuse::Echo
lea esp, [esp - framesz] 有什么用呢? 🤔
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
🐶 Sticker
(恍然大雾)我居然忘记给 NASM 加正确的 flag 了!
我没告诉 NASM,我是要给 i386 汇编!
难怪会出现机器字大小不兼容,frame 分配冲突错误(大寄存器 vs 小 frame local variable allocation = read/write 读取或覆盖无关变量)的问题
也就是说... 为什么 e** 寄存器都有 64 位?是因为我的机器是 x86_64 的,而且它自己的机器寄存器大小就有 128 位... 🙁
rax 是一个 qword,那 eax 自然有一个 dword... 🙊
真的是太 *** 了....
我没告诉 NASM,我是要给 i386 汇编!
难怪会出现机器字大小不兼容,frame 分配冲突错误(大寄存器 vs 小 frame local variable allocation = read/write 读取或覆盖无关变量)的问题
也就是说... 为什么 e** 寄存器都有 64 位?是因为我的机器是 x86_64 的,而且它自己的机器寄存器大小就有 128 位... 🙁
rax 是一个 qword,那 eax 自然有一个 dword... 🙊
真的是太 *** 了....
duangsuse::Echo
🤔 实际上还是得重写 liba.so 真正自己的逻辑,不能直接反汇编然后啥都 OK 了...
事实上:本来应该可以的,但是因为我根本没考虑过 *** 的问题,所以居然还有问题!
🤔 觉得调试符号里会保存关于本地变量偏移的信息,正在迫真查找...
duangsuse::Echo
duangsuse 一通莫名其妙的 local variable extract & reallocation 居然工作正常了,可喜可贺(又被当成编译器用的 duangsuse....)
说实在话,2014 年的 GCC 4.x 做的优化是有,但是它生成的代码非常模式化(比如函数调用基本就是个模板)
所以说反汇编再弄成汇编项目,虽然逆向工程都需要花时间但容易很多。
可是现在即使是基于 SSA 的 native code decompiler RetDec 反编译的结果参考价值都很低,几乎可以说等于没有,还不如 Radare 2 抽象执行自动分析呢
所以说反汇编再弄成汇编项目,虽然逆向工程都需要花时间但容易很多。
可是现在即使是基于 SSA 的 native code decompiler RetDec 反编译的结果参考价值都很低,几乎可以说等于没有,还不如 Radare 2 抽象执行自动分析呢
duangsuse::Echo
说实在话,2014 年的 GCC 4.x 做的优化是有,但是它生成的代码非常模式化(比如函数调用基本就是个模板) 所以说反汇编再弄成汇编项目,虽然逆向工程都需要花时间但容易很多。 可是现在即使是基于 SSA 的 native code decompiler RetDec 反编译的结果参考价值都很低,几乎可以说等于没有,还不如 Radare 2 抽象执行自动分析呢
RetDec 目前对一些简单编译优化的反编译结果参考价值低,从一个侧面劝谏大家要学习去看到汇编后面的东西,不能只会编译一个反编译器然后妄想像 Java 逆向一样,只需要解决混淆的问题就完了。
『手工』反编译需要有基本的编译原理基础,使用 SSA 的思路把树『收』起来也是个不错的想法
『手工』反编译需要有基本的编译原理基础,使用 SSA 的思路把树『收』起来也是个不错的想法
duangsuse::Echo
duangsuse 一通莫名其妙的 local variable extract & reallocation 居然工作正常了,可喜可贺(又被当成编译器用的 duangsuse....)
This media is not supported in your browser
VIEW IN TELEGRAM
其实最后还是我搞错了,两个十六进制数位可以表示一个字节(0-256,0x00-0xff),四个字节是一个字,所以 edb 里的寄存器实际上的确是一个字,不是我想的那样,x86_64 的 r** 也都是 64 位,不是 128 位
在之前我看来好像 ab cd 这四个应该是『一个字』(匹配 .... 这四个单单的数位模式),其实 ab 是一个字节、 cd 又是一个字节,加起来一个半字,远远没有一个字那么长
在之前我看来好像 ab cd 这四个应该是『一个字』(匹配 .... 这四个单单的数位模式),其实 ab 是一个字节、 cd 又是一个字节,加起来一个半字,远远没有一个字那么长
duangsuse::Echo
所以这个『64』位闹剧终于结束了 😵... 真的是相当无聊啊
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
所以这个『64』位闹剧终于结束了 😵... 真的是相当无聊啊
注:之前之所以我误以为有啥双字问题写出的程序还能用是因为那些都是本地变量偏移,增长一点也没什么,参数偏移只有一个而且歪打正着
duangsuse::Echo
这显然是错误的,明明只分配了四个字的空间,却全用的是 dword,这根本不可能可以正常运行,存储位置全是冲突的!反汇编只是为了能让你看得懂机器代码而不可能简单地再重新汇编上吗?
至于这个的问题,就是取本地变量 j 的时候偏移量不对(0xe 是十进制 14,然而 j 变量分配在 0x14 (21) 号单元里,结果是取了一半的 local j,当然有问题),开始我反汇编的时候反汇编器给的全是十六进制数,然后复制过来没有因为无效数位错误的我都没有修改,我以为 NASM 默认全是 16 进制数,可是其实默认全是十进制... 看来我得重新再来了 emmmm