Jarvis OJ - Baby's Crack - Writeup

M4x原创,欢迎转载,转载请表明出处

这是我第一次用爆破的方法做reverse,值得记录一下

题目:

文件下载

分析:

  • 下载后解压有exe和flag.enc两个文件,初步推测flag.enc是用exe加密后的文件,我们只需要分析exe的加密算法,还原flag.enc的明文即可

  • exe无壳,拖到IDA中用F5大法,找到关键代码:

     // local variable allocation has failed, the output may be wrong!
    int __cdecl main(int argc, const char **argv, const char **envp)
    {
    int result; // eax@16
    char Dest; // [sp+20h] [bp-80h]@16
    FILE *v5; // [sp+88h] [bp-18h]@5
    FILE *File; // [sp+90h] [bp-10h]@4
    char v7; // [sp+9Fh] [bp-1h]@6
    int v8; // [sp+B0h] [bp+10h]@1
    const char **v9; // [sp+B8h] [bp+18h]@1 v8 = argc;
    v9 = argv;
    _main(*(_QWORD *)&argc, argv, envp);
    if ( v8 <= )
    {
    printf("Usage: %s [FileName]\n", *v9);
    printf("FileName是待加密的文件");
    exit();
    }
    File = fopen(v9[], "rb+");
    if ( File )
    {
    v5 = fopen("tmp", "wb+");
    while ( feof(File) == )
    {
    v7 = fgetc(File);
    if ( v7 != - && v7 )
    {
    if ( v7 > && v7 <= )
    {
    v7 += ;
    }
    else if ( v7 <= )
    {
    v7 += v7 % ;
    }
    else
    {
    v7 -= v7 % ;
    }
    fputc(v7, v5);
    }
    }
    fclose(v5);
    fclose(File);
    sprintf(&Dest, "del %s", v9[]);
    system(&Dest);
    sprintf(&Dest, "ren tmp %s", v9[]);
    system(&Dest);
    result = ;
    }
    else
    {
    printf("无法打开文件%s\n", v9[]);
    result = -;
    }
    return result;
    }
  • 代码的逻辑很简单,exe读取文件中的每一个字符,经过加密存储到flag.enc中,加密的方式有三种:

      if ( v7 != - && v7 )
    {
    if ( v7 > && v7 <= )
    {
    v7 += ;
    }
    else if ( v7 <= )
    {
    v7 += v7 % ;
    }
    else
    {
    v7 -= v7 % ;
    }
    fputc(v7, v5);
    }
  • 刚开始是想跟进加密的算法推出明文,但后来发现flag.enc中的字符只有52位,而三种加密的算法又很简单,因此完全可以爆破

  • 附上爆破脚本

 #coding:utf-8
import string #将密文转化为ascii码值便于处理,当然没有这一步也是可以的
cipher = 'jeihjiiklwjnk{ljj{kflghhj{ilk{k{kij{ihlgkfkhkwhhjgly'
l = map(ord, cipher)
#l = [106, 101, 105, 104, 106, 105, 105, 107, 108, 119, 106, 110, 107, 123, 108, 106, 106, 123, 107, 102, 108, 103, 104, 104, 106, 123, 105, 108, 107, 123, 107, 123, 107, 105, 106, 123, 105, 104, 108, 103, 107, 102, 107, 104, 107, 119, 104, 104, 106, 103, 108, 121] #爆破的范围为所有可打印字符
dic = string.printable #三种加密方式
f1 = lambda x: chr(x - 53)
def f2(x):
for i in dic:
if ord(i) + ord(i) % 11 == x:
return chr(i) def f3(x):
for i in dic:
if ord(i) - ord(i) % 61 == x:
return chr(i) #爆破函数,逐位对密文进行爆破
def crack():
ans = ''
for i in l:
try:
ans += f1(i)
except:
pass try:
ans += f2(i)
except:
pass try:
ans += f3(i)
except:
pass return ans #爆破出的明文是16进制的,还要进行解码
# print crack()
print crack().decode('hex')
  • 运行得到flag

Jarvis OJ - Baby's Crack - Writeup的更多相关文章

  1. Jarvis OJ - [XMAN]level1 - Writeup

    Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分 ...

  2. Jarvis OJ - class10 -Writeup

    Jarvis OJ - class10 -Writeup 转载请注明出处:http://www.cnblogs.com/WangAoBo/p/7552266.html 题目: Jarivs OJ的一道 ...

  3. Jarvis OJ - 栈系列部分pwn - Writeup

    最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...

  4. Jarvis OJ - 软件密码破解-1 -Writeup

    Jarvis OJ - 软件密码破解-1 -Writeup 转载请标明出处http://www.cnblogs.com/WangAoBo/p/7243801.html 记录这道题主要是想记录一下动态调 ...

  5. Jarvis OJ - DD-Hello -Writeup

    Jarvis OJ - DD-Hello -Writeup 转载请注明出处http://www.cnblogs.com/WangAoBo/p/7239216.html 题目: 分析: 第一次做这道题时 ...

  6. Jarvis OJ - 爬楼梯 -Writeup

    Jarvis OJ - 爬楼梯 -Writeup 本来是想逆一下算法的,后来在学长的指导下发现可以直接修改关键函数,这个题做完有种四两拨千斤的感觉,记录在这里 转载请标明出处:http://www.c ...

  7. Jarvis OJ部分逆向

    Jarvis OJ部分逆向题解 很久没有写博客了,前天上Jarvis OJ刷了几道逆向,保持了一下感觉.都是简单题目,写个writeup记录一下. easycrackme int __cdecl ma ...

  8. jarvis OJ WEB题目writeup

    0x00前言 发现一个很好的ctf平台,题目感觉很有趣,学习了一波并记录一下 https://www.jarvisoj.com 0x01 Port51 题目要求是用51端口去访问该网页,注意下,要用具 ...

  9. Jarvis OJ - [XMAN]level3 - Writeup——ret2libc尝试

    这次除了elf程序还附带一个动态链接库 先看一下,很一般的保护 思路分析 在ida中查看,可以确定通过read函数输入buf进行溢出,但是并没有看到合适的目标函数 但是用ida打开附带的链接库,可以看 ...

随机推荐

  1. nginx 配置 强制访问https

    使用nginx的301状态码 server { listen ;     if ($scheme = 'http') {    return 301 https://$server_name$requ ...

  2. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

  3. 小程序y轴拖动

    需求场景 小程序在y轴方向 拖动 一小段距离 解决方案 1.监听 元素 2.绑定 点击 和 移动 事件 3.数据处理 代码 <view animation="{{item.animat ...

  4. 一直报找不到function,然后又不为null。最后发现是个数组。哭死。

    今天写代码,报找不到function.然后又不为空.最后发现是类型不对.因为是数组,所以不能用node.function(),而应该用nodeArr[0].function.错用前者会找不到funct ...

  5. 假期学习【十】首都之窗百姓信件JavaWweb+Echarts图表展示

    今天主要对昨天爬取的数据进行处理,处理后用Echart图表展示, 效果如下:

  6. sqli-labs less-1 --> less-4

    Less-1  (报错注入) 因为第一次做这些题,不太了解,所以$sql下加上echo "$sql<br>";能更明显的看出具体的输入 1.判断是否存在注入点 当输入? ...

  7. C# SDO_GEOMETRY

    OracleParameter endGeometry = cmd.CreateParameter(); endGeometry.OracleDbType = OracleDbType.Object; ...

  8. 用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)

    问题描述 在 window 系统上,用 Navicat 连接 Mysql 数据库,弹出以下提示 问题原因  Mysql 数据库未启动 解决方案:启动 Mysql 数据库 1.点击桌面左下角运行 cmd ...

  9. 安装python3.7.4时报错:Service Pack 1 is required to continue installation

    python3.7.4安装失败:Service Pack 1 is required to continue installation 解决办法: 点击报错页面中的“log file”,日志最后一行显 ...

  10. vue学习指南:第十三篇(详细) - Vue的 路由 第三篇 ( 路由的缓存 )

    路由的缓存 路由缓存是 Vue组件优化的一个重要方法 为什么实现路由缓存? 为了 组件间 相互切换不会重复加载数据,影响用户体验,我们通常需要将组件的数组实现缓存,当我们点过来,在点的时候会再次发送 ...