【NSSCTF】jump_by_jump
收获
识别花指令,以及花指令的去除与修复
IDA 中的 JUMPOUT 函数
思路一(非预期解)
拖入 IDA,shift + F12
查看字符串,可直接看到 flag:NSSCTF{Jump_b9_jump!}
思路二
拖入 IDA,F5 查看 main 函数
发现 JUMPOUT 函数,说明 main 函数无法正确编译
跟进到 0x411860
发现是有汇编代码的,但是 IDA 没有正确识别该函数的内容
在下面发现 jz、jnz 花指令,跳转到 loc_41188C+1
执行,然后执行 call 指令
去除花指令:
先将 call 指令 call near ptr 41BC4932h
转换成硬指令
选中 call 指令,按快捷键 D
点击 yes 后:
将 call 的硬指令 db 0E8h
从 E8 改为 90:E8 表示执行,90 表示跳过
选中指令 db 0E8h
依次打开 Edit -> Patch program -> Change byte
(或者 右键 -> pathing -> change byte
)
将开头的 E8 修改为 90
修改后:
再将硬指令 db 90h
转换回代码:
选中指令 db 90h
,按快捷键 C
转换后:
接下来,将后面的指令依次按快捷键 C 进行修复 (黄色部分的所有地址)
全部修复后:
最后,将光标置于函数 main 开始的地方
按快捷键 P ,将修复后的代码重新生成函数
可以看到 IDA 生成了一个新的函数 main_0
此时搜索函数名 main
,就可以看到新生成的函数 main_0
F5 生成 main_0 的伪代码,此时 IDA 可以正常编译
这里先把字符串 "NSSCTF{Jump_b9_jump!}"
赋值给 v5,然后 for 循环对 v5 进行操作,输出 v5
但是操作与 flag 无关,最终的 flag 就是 NSSCTF{Jump_b9_jump!}
结果
NSSCTF{Jump_b9_jump!}