攻防世界:Crackme

查壳,是nspack壳

脱壳工具能直接脱掉,这里我们研究一下手工脱壳 。

“由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置”

x32打开,停在入口点,按F8走单步两步,发现确实只有ESP变化(FPU)窗口

走两步到call了,这时候直接从esp转到内存设置硬件断点访问四字节

这样继续执行就会停在这里

单步进入jmp的位置,这里就是OEP

用Scylla,OEP的数值就设置这里,然后IAT Autosearch,再get imports,dump,pe rebuild,fix dump,就可以dump出来文件,没壳。 

 

再看代码就很简单了

 

提取两个数组异或一下就出来了 

#include <iostream>

int main()
{
    unsigned char byte_402130[] =
    {
      116, 104, 105, 115,  95, 105, 115,  95, 110, 111,
      116,  95, 102, 108,  97, 103,   0,   0,   0,   0,
        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        0,   0
    };
    unsigned char dword_402150[] =
    {
       18,   4,    8,   20,   36,  
       92,   74,     61,   86,  10,  
       16,   103,    0,   65,   0,   
        1,   70,    90,   68,   66,  
      110,     12,     68,   114,     12,   
       13,     64,  62,    75,    95,   
        2,     1,     76,    94,    91,  
       23,    110,     12,   22,   104,   
       91,    18,          0,   72,     0,
        0,   0,   0,   0,   0,   0
    };
    char Buffer[50] = "";
    int v4 = 0;
    for (v4 = 0; v4 < 42; v4++) {
        char c = dword_402150[v4] ^ byte_402130[v4 % 16];
        std::cout << c;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值