花指令

前言

把22年寒假的WP转移到blog上,这次是花指令专题的,原题链接在最底下。


JunkCode

先拖到die看看,是无壳pe32,拖到ida32打开,先找到main函数,发现main函数分析不出来

屏幕截图 2023-01-04 185208

找到地址0x411810处的代码,出问题的代码如下

屏幕截图 2023-01-04 185501

经过学习,这里有一段花指令,clc和jnb构成了跳转指令,紧跟着的指令很可能有垃圾数据,导致ida分析出错,用x32dbg打开找到这段指令

屏幕截图 2023-01-04 185043

可以看出来正常程序是跳转到0x411832处,单步走,发现跳过6A的话程序结构就正常了

屏幕截图 2023-01-04 190045

在ida里把6Apatch掉,改成90,重新分析代码,得到正确的main函数

屏幕截图 2023-01-04 190500

屏幕截图 2023-01-04 190546

这里的sub_411046即printf函数,最终会输出this is junk code


reverseMe

先用die打开,无壳pe32,用ida32打开,先找到main函数,发现函数很怪,直接跳转到下面一段代码就结束了,查看字符串也没收获,想要od调试也不行。

经过指导找到tls函数,经过学习知道tls函数里面有反调试。

查看tls函数,发现有几个函数都显示jumpout,并且tls函数和main函数一样出现了错误的返回值,找到之前函数jumpout的位置,基本都在main函数跳过的区间里,可以判断main函数里面藏了花指令,经过查找对比花指令应该是类似如下部分的

屏幕截图 2023-02-02 192633

搜索找到类似的花指令patch掉,然后把之前未识别的函数创建出来,代码逻辑清晰了一些

在main函数原先跳转位置找到关键跳转代码

屏幕截图 2023-02-02 193509

顺着跳转找到输出错误提示的函数sub_411A80,函数通过异或隐藏字符串信息

屏幕截图 2023-02-02 193730

回到刚刚找到的跳转表,查看谁调用了它,发现另外一个跳转表

屏幕截图 2023-02-02 194310

查看里面的函数,sub_415170是另一个关键函数,负责获得flag输入

屏幕截图 2023-02-02 194733

里面的字符串也是用了异或来隐藏,其中有个疑似是判断flag的数组byte_41D1E0,猜想flag可能为8位,且需要与0x4D异或,查看引用这个数组的函数

屏幕截图 2023-02-02 194911
其中sub_411E70应该是flag判断函数,打开看看

屏幕截图 2023-02-02 195054

发现只有前4位,查看汇编发现了retf指令,说明这个函数可能采用了32位和64位指令的混淆,猜测mov后面跟着的数据有64位长,即flag异或前为*+!,6(0**

屏幕截图 2023-02-02 200335

编写代码如下可得flag

#include <stdio.h>

int main()
{
    char flag[100] = "+!,*6(0";

    for (int i = 0; i < 7; i++)
    {
        flag[i] = flag[i] ^ 0x4D;
        printf("%c", flag[i]);
    }

    return 0;
}

得到flag为flag{e}

屏幕截图 2023-02-02 200517

验证通过

屏幕截图 2023-02-02 200647


下载链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇