[HNCTF 2022 WEEK2]e@sy_flower
1.查壳选择合适IDA
2.发现去除花指令
发现花指令
jnz+jz用连续两条相反的条件跳转,或是通过stc/clc汇编指令来设置位,使条件跳转变为永真或者永假跳转
将花指令nop
Edit-Patch program-Change bytes
将E9改为90
3.反编译
找到main函数,在main函数之前摁P重定义
F5反编译
函数的分析
(1)Arglist中的字符两两交换位置(2n与2n+1交换)
(2)Arglist中的每个字符与字符’0’进行异或操作
4.脚本
嘿嘿嘿得到flag
[LitCTF 2023]ez_XOR
1.查壳选IDA
2.寻找关键字符
shift+F12
发现关键字并追踪
3.反编译
并不是到此处就可以直接写脚本了,点击XOR发现里面还有玄机
好了,现在可以写脚本了
4.脚本
花指令的小知识
形式一:
如果我们插入的花指令是一个操作码,那么后面程序原本的机器码就会被误认为是这个操作码的操作数,从而导致反汇编引擎的解析错误。
形式二:
插入的花指令也可以是改变堆栈平衡的汇编代码,跟形式一相同在这些花指令上面写上跳转指令,虽然花指令不会被执行,但是IDA进行解析时会认为该函数堆栈不平衡,从而使F5功能失效
保持堆栈的平衡
push ebp — -把基址指针寄存器压入堆栈
pop ebp —-把基址指针寄存器弹出堆栈
push eax —-把数据寄存器压入堆栈
pop eax —-把数据寄存器弹出堆栈
nop —–不执行
add esp,1—–指针寄存器加1
sub esp,-1—–指针寄存器加1
add esp,-1——–指针寄存器减1
sub esp,1—–指针寄存器减1
inc ecx —–计数器加1
dec ecx —–计数器减1
sub esp,1 —-指针寄存器-1
sub esp,-1—-指针寄存器加1
jmp 入口地址—-跳到程序入口地址
push 入口地址—把入口地址压入堆栈
retn —— 反回到入口地址,效果与jmp 入口地址一样
mov eax,入口地址 ——把入口地址转送到数据寄存器中.
jmp eax —– 跳到程序入口地址
jb 入口地址
jnb 入口地址 ——效果和jmp 入口地址一样,直接跳到程序入口地址
xor eax,eax 寄存器EAX清0
CALL 空白命令的地址 无效call