Jarvis OJ - Baby's Crack - Writeup
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的更多相关文章
- Jarvis OJ - [XMAN]level1 - Writeup
		Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分 ... 
- Jarvis OJ - class10 -Writeup
		Jarvis OJ - class10 -Writeup 转载请注明出处:http://www.cnblogs.com/WangAoBo/p/7552266.html 题目: Jarivs OJ的一道 ... 
- Jarvis OJ - 栈系列部分pwn - Writeup
		最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ... 
- Jarvis OJ - 软件密码破解-1 -Writeup
		Jarvis OJ - 软件密码破解-1 -Writeup 转载请标明出处http://www.cnblogs.com/WangAoBo/p/7243801.html 记录这道题主要是想记录一下动态调 ... 
- Jarvis OJ - DD-Hello -Writeup
		Jarvis OJ - DD-Hello -Writeup 转载请注明出处http://www.cnblogs.com/WangAoBo/p/7239216.html 题目: 分析: 第一次做这道题时 ... 
- Jarvis OJ - 爬楼梯 -Writeup
		Jarvis OJ - 爬楼梯 -Writeup 本来是想逆一下算法的,后来在学长的指导下发现可以直接修改关键函数,这个题做完有种四两拨千斤的感觉,记录在这里 转载请标明出处:http://www.c ... 
- Jarvis OJ部分逆向
		Jarvis OJ部分逆向题解 很久没有写博客了,前天上Jarvis OJ刷了几道逆向,保持了一下感觉.都是简单题目,写个writeup记录一下. easycrackme int __cdecl ma ... 
- jarvis OJ WEB题目writeup
		0x00前言 发现一个很好的ctf平台,题目感觉很有趣,学习了一波并记录一下 https://www.jarvisoj.com 0x01 Port51 题目要求是用51端口去访问该网页,注意下,要用具 ... 
- Jarvis OJ - [XMAN]level3 - Writeup——ret2libc尝试
		这次除了elf程序还附带一个动态链接库 先看一下,很一般的保护 思路分析 在ida中查看,可以确定通过read函数输入buf进行溢出,但是并没有看到合适的目标函数 但是用ida打开附带的链接库,可以看 ... 
随机推荐
- SQL Server database – Error 3743
			Database mirroring must be removed before you drop SQL Server database – Error 3743 If you try to dr ... 
- Docker最全教程——从理论到实战(二十三)
			如何节约云端成本? 上云在大部分情况下就是为了降低成本,在这方面,主流的容器服务基本上都能够有效地降低成本——不仅能够高效自动化的管理和控制容器,而且不需支付Kubernetes 主节点的费用.不过, ... 
- Flutter简易顶部导航
			因为在AppBar的bottom参数中返回TabBar在平板模式的对齐模式是居中的且不可调整,所有将TabBar在title中返回 import 'package:flutter/material.d ... 
- java学习笔记之IO编程—File文件操作类
			1. File类说明 在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作( ... 
- ECMAScript基本对象——function定义函数
			function:函数对象=java方法,java的方法或者函数是,java对象的一部分. JavaScript的函数或者方法,就是一个对象实参:都必须具有确定的值, 以便把这些值传送给形参. 形参: ... 
- IntelliJ IDEA Ultimate 6.2 版本免费试用期过期后如何破解
			今天早上一打开IntelliJ IDEA时弹出“InteliJ IDEA License Activation”界面,需要激活新的license才可以使用.下面直接使用Activation code进 ... 
- POJ2528Mayor's posters  线段树,离散化技巧
			题意:一个坐标轴从1~1e7,每次覆盖一个区间(li,ri),问最后可见区间有多少个(没有被其他区间挡住的) 线段树,按倒序考虑,贴上的地方记为1,每次看(li,ri)这个区间是否全是1,全是1就说明 ... 
- 【Python】画一个心形
			#!/usr/bin/env python # -*- coding:utf-8 -*- import turtle import time # 画心形圆弧 def hart_arc(): for i ... 
- Wannafly Camp 2020 Day 1I K小数查询 - 分块
			给你一个长度为\(n\)序列\(A\),有\(m\)个操作,操作分为两种: 输入\(x,y,c\),表示对\(i\in[x,y]\),令\(A_{i}=min(A_{i},c)\) 输入\(x,y,k ... 
- js 获取项目名称
			//获取项目名称function getWebName(){ var pathName = window.location.pathname.substring(1); var webName = p ... 
