花指令(例题)

发布时间 2023-12-17 13:30:21作者: kelec0ka

[GFCTF 2021]wordy

pe查壳,无壳64位ELF文件

image

kali上运行以下

image

拖进IDA中看看

image

无主函数,应该有花指令

image

这里发现1144出错导致IDA无法识别,内容为EBFF机器码

这里因为我们需要取出 EBFF 下面的地址,也都是 EBFF, 所以工作量巨大,故使用IDA自带的python编写脚本

start = 0x1135  #开始地址
end = 0x3100    #结束地址

for i in range(start,end):
    if get_wide_byte(i)==0xEB:          #前两个EB
        if get_wide_byte(i+1) == 0xFF:  #后两个FF
            patch_byte(i,0x90)          #改为0x90(nop掉)

运行后蹦出来了

image

flag为GFCTF'{u_are2wordy}'

[NSSRound#3 Team]jump_by_jump

pe查壳,无壳32位

image

拖进IDA中打开

image

发现了花指令

               jz      short near ptr loc_41188C+1
               jnz     short near ptr loc_41188C+1
loc_41188C:
               call    near ptr 41BC4932h

是jz和jnz互相构筑的跳转花指令

直接把call那段nop掉(注意不要直接nop,要不然会把下面几行一起nop掉),在Patch Bytes里把E8改成90

image

然后点击左边黄色部分,按c一步一步把它转为红褐色

image

然后找到main函数点击p重构,最后f5反编译

image

[NSSRound#3 Team]jump_by_jump_revenge

pe查壳,无壳32位

image

拖进IDA中

image

发现花指令,90nop掉,再在main函数处p重构,f5反汇编

image

点进j_strcmp函数看看

image

那么开始编写脚本

a=['~','4','G','~','M',':','=','W','V','7','i','X',',','z','l','V','i','G','m','u','4','?','h','J','0','H','-','Q','*']
for i in range(28,-1,-1):
    k = (i * i + 123) % 21
    for j in range(3):
        x=(ord(a[i])-0x20+j*0x60-ord(a[k]))
        if x>=33 and x<=126:               #print(chr(x))
            a[i]=chr(x)
            break
flag=''
for i in a:
    flag+=i
print(flag)

image

[MoeCTF 2022]chicken_soup

pe查壳,无壳32位

image

拖进IDA中

image

发现了sub_401000和sub_401080对v4进行了加密,点进去看看

image
image

全部nop掉,在401000和401080处按p重构

然后就可以点进去看伪代码了

image
image

然后就可以开始编写脚本了

result =[0xcd,0x4d,0x8c,0x7d,0xad,0x1e,0xbe,0x4a,0x8a,0x7d,0xbc,0x7c,0xfc,0x2e,0x2a,0x79,0x9d,0x6a,0x1a,0xcc,0x3d,0x4a,0xf8,0x3c,0x79,0x69,0x39,0xd9,0xdd,0x9d,0xa9,0x69,0x4c,0x8c,0xdd,0x59,0xe9,0xd7]

for i in range(len(result)):
	result[i] = (result[i] // 16 | result[i] << 4) & 0xff
	print((result[i]))

for i in range(len(result)-1, 0, -1):
    result[i-1] -= result[i]

print(bytes(result))

image