花指令(例题)
[GFCTF 2021]wordy
pe查壳,无壳64位ELF文件
kali上运行以下
拖进IDA中看看
无主函数,应该有花指令
这里发现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掉)
运行后蹦出来了
flag为GFCTF'{u_are2wordy}'
[NSSRound#3 Team]jump_by_jump
pe查壳,无壳32位
拖进IDA中打开
发现了花指令
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
然后点击左边黄色部分,按c一步一步把它转为红褐色
然后找到main函数点击p重构,最后f5反编译
[NSSRound#3 Team]jump_by_jump_revenge
pe查壳,无壳32位
拖进IDA中
发现花指令,90nop掉,再在main函数处p重构,f5反汇编
点进j_strcmp函数看看
那么开始编写脚本
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)
[MoeCTF 2022]chicken_soup
pe查壳,无壳32位
拖进IDA中
发现了sub_401000和sub_401080对v4进行了加密,点进去看看
全部nop掉,在401000和401080处按p重构
然后就可以点进去看伪代码了
然后就可以开始编写脚本了
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))