花指令不知道怎么处理了,求大佬指教
如题,一道ctf的花指令题目,求解题过程一个*.sys的驱动程序,入口函数在sub_140001060()可以看到flag
sub_140001100()函数里面有个sub_140001000()没有被正常解析,导致srand设置的随机数种子没有被正常设置。
原程序:链接:https://pan.baidu.com/s/11NUAElxpy9v2fmFSkf6Mww
提取码:6666
花指令段二进制代码如下图:
本帖最后由 爱飞的猫 于 2024-5-3 09:45 编辑
Tempests 发表于 2024-5-2 21:08
感谢指导,
简单的操作我还是会一些的,一般来说只需要对特定的编码(如图中100D位置的E8进行nop)即可 ...
0000000140001001 开始是花指令,本质上就是将程序跳转到 000000014000100E 继续执行。
https://imgsrc.baidu.com/forum/pic/item/38dbb6fd5266d01691b45414d12bd40735fa3559.png
将 140001001 到 14000100D 全部 NOP 掉即可:
https://imgsrc.baidu.com/forum/pic/item/9345d688d43f87942f4e8212941b0ef41bd53a5d.png
然后分析调用方:
```asm
.text:000000014000111A C7 44 24 24 52 BF 01 00 mov dword ptr , 1BF52h
.text:0000000140001122 E8 D9 FE FF FF call sub_140001000 ; 这个函数修改 "rsp+2Ch" 的值,实际上就是此处的 "rsp+24h" 的值
.text:0000000140001127 8B 4C 24 24 mov ecx, ; Seed
.text:000000014000112B E8 03 01 00 00 call srand
``` 利用 patching 等插件将花指令 nop,对函数头的地址按下 u 取消定义,再按 c 将所在区域作为代码分析,最后按 p 重新建立函数
可能有更方便的操作方法,但手动操作这样是可行的。 爱飞的猫 发表于 2024-5-2 16:51
利用 patching 等插件将花指令 nop,对函数头的地址按下 u 取消定义,再按 c 将所在区域作为代码分析,最后 ...
感谢指导,
简单的操作我还是会一些的,一般来说只需要对特定的编码(如图中100D位置的E8进行nop)即可正常编译,但此题目在处理后还存在返回和代码不连贯的问题,
sub_140001000是call进来的,在loc_140001006中含有ret,后续的应执行函数无法正常执行,
如果改变函数结构,nop 1006处的ret并不能正确编译执行,当然直接跳过该段对整体函数是可行的,
但flag的正确函数与 14000101D 的数据是否正确解析有关
望指点一二{:1_893:} 多谢版主指点,确实是ida使用尚有不熟,您的分析清楚明了,着实恍然大悟 {:1_893:}{:1_893:}
页:
[1]