目录
[GFCTF2021]-wordy
[NSSRound#3 Team]jump_by_jump
学到的点:
下载附件,查壳,发现没壳,接着拖入到da中
打开附件,找主函数发现无法编译,考虑是花指令
可以看到标红的这段有一段代码
loc_1144:
jmp short near ptr loc_1144+1
这串代码并没有实际的作用,看了很多大佬 的wp才知道这 是一种常见的花指令。把这段代码nop掉就可以,即找到机械码为EBFF的,把它改成90(即为no的机械码),但是我们发现下面的数据中含有大量的EBFF机械码,手动nop坑定是很麻烦的,这时就可以使用idapython(file-Script command打开),用上脚本直接把所有的jmp花指令nop掉
其中startaddr时初始地址,endaddr是结束地址,get_wide_byte()函数是常用的命令,含义是get_wide_byte(ea)/get_wide_dword/word(ea)create_data(ea, dataflag, size, tid)转变为数据(byte,word,dword,etc),patch_byte(addr,byte)是设置addr处的一个字节值(其他的ida命令可以参考一位大佬的文章(IDA常用命令_ida命令_z2664836046的博客-CSDN博客)之后可以直接找到flag
GCTF{u_are2wordy}(flag在一串数据的中间)
下载附件,查壳,发现无壳
在ida中打开,找到主函数
发现出现了爆红,并且无法反汇编,可能是花指令,可以看到上面的代码段,
89 45 FC mov [ebp-4], eax
.text:00411888 74 03 jz short near ptr loc_41188C+1
.text:00411888
.text:0041188A 75 01 jnz short near ptr loc_41188C+1
.text:0041188A
.text:0041188C
.text:0041188C loc_41188C: ; CODE XREF: .text:00411888↑j
.text:0041188C ; .text:0041188A↑j
.text:0041188C E8 A1 30 7B 41 call near ptr 41BC4932h
.text:0041188C
.text:00411891 00 89 45 E0 8B 0D add [ecx+0D8BE045h], cl
其中代码:
jz short near ptr loc_41188C+1
jnz short near ptr loc_41188C+1
loc_41188C:
call near ptr 41BC4932h
call near ptr 41BC4932h
上面的jz,jnz命令分别是当零标志位为1时和当零标志位位0时跳转,所以无论如何都会跳转,跳转到loc_41188C+1的位置,就是跳过loc_41188C的一个字节的指令去执行下面的内容,也就是说此处反汇编引擎进行了失误的判断,call语句的指令实际上应该是没有意义的数据。
用快捷键D直接转换为data
但转换时会将一大串的指令都转换成data,但是只有call指令那句是没有作用的,所以我们需要识别call语句(即转换后的0E8h)下面的内容
选中要识别的数据,右键analze进行识别,将下面的指令识别为代码
但是此时还是无法显示伪代码,需要将之前修改的call(即转换后为0E8h)nop掉,让它直接过
此时就可以创建函数,显示伪代码啦(开心)
直接看到flag
(其实shift+f12也可以直接看到 flag,通过这题学习一点花指令吧
loc_1144:
jmp short near ptr loc_1144+1
jz short near ptr loc_41188C+1
jnz short near ptr loc_41188C+1
loc_41188C:
call near ptr 41BC4932h
call near ptr 41BC4932h
1。两种常见的花指令形式
2,如何处理这两种花指令:直接将插入的花指令nop掉 (把代码转换成数据,然后将对应机械码改成0x90,再转换回代码,这样函数代码就连成一个整体,之后可以创建函数)
3.注意:如果要nop的指令过多,可以用idapython脚本
参考文章:
花指令
花指令二
ida常用指令