收获

  • 识别花指令,以及花指令的去除与修复

  • IDA 中的 JUMPOUT 函数


【NSSCTF】jump_by_jump


思路一(非预期解)

拖入 IDA,shift + F12 查看字符串,可直接看到 flag:NSSCTF{Jump_b9_jump!}

NSSCTF-jump_by_jump1.png


思路二

拖入 IDA,F5 查看 main 函数

NSSCTF-jump_by_jump2.png

发现 JUMPOUT 函数,说明 main 函数无法正确编译

跟进到 0x411860

NSSCTF-jump_by_jump3.png

发现是有汇编代码的,但是 IDA 没有正确识别该函数的内容

在下面发现 jz、jnz 花指令,跳转到 loc_41188C+1 执行,然后执行 call 指令

NSSCTF-jump_by_jump4.png

去除花指令:
先将 call 指令 call near ptr 41BC4932h 转换成硬指令
选中 call 指令,按快捷键 D

NSSCTF-jump_by_jump5.png

点击 yes 后:

NSSCTF-jump_by_jump6.png

将 call 的硬指令 db 0E8h 从 E8 改为 90:E8 表示执行,90 表示跳过

选中指令 db 0E8h
依次打开 Edit -> Patch program -> Change byte (或者 右键 -> pathing -> change byte

NSSCTF-jump_by_jump7.png

将开头的 E8 修改为 90

NSSCTF-jump_by_jump8.png

修改后:

NSSCTF-jump_by_jump9.png

再将硬指令 db 90h 转换回代码:
选中指令 db 90h,按快捷键 C

NSSCTF-jump_by_jump10.png

转换后:

NSSCTF-jump_by_jump11.png

接下来,将后面的指令依次按快捷键 C 进行修复 (黄色部分的所有地址)
全部修复后:

NSSCTF-jump_by_jump12.png

最后,将光标置于函数 main 开始的地方

NSSCTF-jump_by_jump13.png

按快捷键 P ,将修复后的代码重新生成函数

NSSCTF-jump_by_jump14.png

可以看到 IDA 生成了一个新的函数 main_0
此时搜索函数名 main,就可以看到新生成的函数 main_0

NSSCTF-jump_by_jump15.png

F5 生成 main_0 的伪代码,此时 IDA 可以正常编译

NSSCTF-jump_by_jump16.png

这里先把字符串 "NSSCTF{Jump_b9_jump!}" 赋值给 v5,然后 for 循环对 v5 进行操作,输出 v5
但是操作与 flag 无关,最终的 flag 就是 NSSCTF{Jump_b9_jump!}


结果

NSSCTF{Jump_b9_jump!}