花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解

目录

[GFCTF2021]-wordy

[NSSRound#3 Team]jump_by_jump

学到的点:


[GFCTF2021]-wordy

下载附件,查壳,发现没壳,接着拖入到da中

打开附件,找主函数发现无法编译,考虑是花指令

花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第1张图片

 可以看到标红的这段有一段代码

loc_1144:                           
             jmp     short near ptr loc_1144+1

 这串代码并没有实际的作用,看了很多大佬 的wp才知道这 是一种常见的花指令。把这段代码nop掉就可以,即找到机械码为EBFF的,把它改成90(即为no的机械码),但是我们发现下面的数据中含有大量的EBFF机械码,手动nop坑定是很麻烦的,这时就可以使用idapython(file-Script command打开),用上脚本直接把所有的jmp花指令nop掉

花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第2张图片

其中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在一串数据的中间)

[NSSRound#3 Team]jump_by_jump

下载附件,查壳,发现无壳

在ida中打开,找到主函数

花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第3张图片

 花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第4张图片

发现出现了爆红,并且无法反汇编,可能是花指令,可以看到上面的代码段,

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

花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第5张图片

但转换时会将一大串的指令都转换成data,但是只有call指令那句是没有作用的,所以我们需要识别call语句(即转换后的0E8h)下面的内容

花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第6张图片

选中要识别的数据,右键analze进行识别,将下面的指令识别为代码

花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第7张图片

 但是此时还是无法显示伪代码,需要将之前修改的call(即转换后为0E8h)nop掉,让它直接过

 花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第8张图片

 花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第9张图片

此时就可以创建函数,显示伪代码啦(开心)

花指令相关-[GFCTF2021]-wordy,[NSSRound#3 Team]jump_by_jump题解_第10张图片

直接看到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常用指令

           

你可能感兴趣的:(网络安全)