[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