sun博客

记录点滴!

搞了一天,发现在调用喜马拉雅xd加密函数时,使用unicorn老是失败,最后发现是可能开启了堆栈保护的原因,于是本地写了段demo进行测试。发现果真如此。

安卓cmakelists文件中添加以下代码开启函数堆栈保护:

add_compile_options(-fstack-protector-all)

ida打开so文件,找到add方法,使用unicorn调用会报错,因为调用了外部的__stack_chk_guard_ptr,需要对它进行修复才可以。使用unidbg调用成功后把r0,r1,r2的值添加注释如下:

根据这段汇编代码,可知堆栈保护的处理流程。程序开始时就把堆栈保护的__stack_chk_guard(r3)值的存储到堆栈中,即将返回时从堆栈中取出后与原始的 __stack_chk_guard 对比,如果存储到堆栈中的值发生变化(cmp r0,r1),证明程序有溢出攻击或者修改了堆栈, 调用_stack_chk_fail中止程序。相等则继续执行下一条指令。

从这里可得知, __stack_chk_guard_ptr 是一个二级指针,两次读取指针后结果其是0,所以使用unicorn构造需要进行2次写入内存即可。

SP = stack_base + stack_size - 0x400
mu.mem_write(stack_base + 0x26BBC, struct.pack("I",SP+8))
mu.mem_write(SP+8, struct.pack("I", 0))

调用成功,返回值为3。

原本以为继续过了这个坑就是一路太平,结果发现后面还有好多个坑。真是无语,进入下一个坑。然而下一个坑还不知道怎么解决。

unicorn 真是难搞,自己写就是一堆错误,不知道unidbg是怎么正常跑通的,看来unidbg是真的值得好好学习的。

发表评论

邮箱地址不会被公开。 必填项已用*标注