实验吧 逆向 小练习

                       

阿拉丁神灯

迷得很,还以为需要真正的逆向,就是找到关键字符串…第一下就不合常理…

这里写图片描述

看来所有的逆向之前还是看一下段啊字符串什么有没有藏东西,或者看到返回的关键字爆搜一下嗯

FLAG

打开发现是什么输入flag?怎么像WEB???然后看到源码中有JS代码
关键的代码太多了,主要就是人工找到突破口吧。其实并不麻烦,因为你观察一下由短到长是有规律的,我倒是觉得是数据分析能力,用一个函数排序,然后一个个试试就行了…

flag{wh47_my5ter10us-do3s,the+phe45ant/c0nta1n}
   
   
  • 1

转瞬即逝

神特么转瞬即逝…名字和题目没有半毛钱关系好吧….

这里写图片描述

这就很明显了…不解释了…

#_*_coding:utf-8_*_s='tikp[luX|aoTjaoh'flag=""for i in range(len(s)):    flag+=chr(ord(s[i])^i)print flag#this_is_the_flag
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

有一个程序加密得到如下密文

反汇编一下得到源代码
但是看了半天感觉神了,应该是不知道的某种对称加密,但是这个加密解密过程都给了,尝试解密发现返回是空值,为什么!观察代码发现密文0-9位之间是一个关于时间戳的东西,10-25位是一个md5值,后面都是原密文,然后这个串被一个box盒进行了抑或替换…解密过程也是简单的,仅仅是再做一次轮换然后判断是不是中间的md5值后后面的string有关….有点像AES。按道理加密解密过程不会影响结果(前面分析纯属好奇),但是我们看到了关键的几个限制条件…

这里写图片描述

解决方法就是把他改成

print True
   
   
  • 1

然后运行解密即可

这里写图片描述

DUTCTF{2u0_chu_14i_d3_5hi_h3n74i}
   
   
  • 1

babyCrack.exe

这里写图片描述

这个。。。

hctf{bABy_CtsvlmE_!}
   
   
  • 1

bin100(ebCTF 2013)

这里写图片描述

大概看了一下,就是所谓的筛子游戏,需要让你筛出一连串的对应的点数嗯,但是这概率很小。总体来说貌似你需要筛出3-1-3-3-7这个顺序,但是这概率很小,所以我们尝试修改程序中的判断流程
这里写图片描述

随便一改,将匹配值改成7,改成匹配就跳转,然后是永远不可能匹配的,一定不会跳转
这里写图片描述

这里写图片描述

ebCTF{64ec47ece868ba34a425d90044cd2dec}
   
   
  • 1

CFG to C

这个这个,选择题???

BCDA
   
   
  • 1

Byte Code

看到是.class文件,如何反汇编,找到工具jd-GUI就行了,得到源代码…

import java.io.Console;import java.io.PrintStream;class Authenticator{  public static char[] key;  public static void main(String[] paramArrayOfString)  {    key = new char[10];    key[0] = 'A';    key[1] = 'o';    key[2] = 'J';    key[3] = 'k';    key[4] = 'V';    key[5] = 'h';    key[6] = 'L';    key[7] = 'w';    key[8] = 'U';    key[9] = 'R';    Console localConsole = System.console();    String str = "";    while (!str.equals("ThisIsth3mag1calString4458")) {      str = localConsole.readLine("Enter password:", new Object[0]);    }    for (int i = 0; i < key.length; i++) {      System.out.print(key[i]);    }    System.out.println("");  }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
答案:AoJkVhLwUR
   
   
  • 1

bitwise

简单题

#_*_coding:utf-8 _*_verify_arr = [193, 35, 9, 33, 1, 9, 3, 33, 9, 225]user_arr = []flag=''for i in range(10):    for j in range(30,140):        if ( (((j << 5) | (j >> 3)) ^ 111) & 255 )==verify_arr[i]:            flag+=chr(j)            breakprint flag#ub3rs3cr3t
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

smali文件分析

用jeb反汇编得到代码

public class Hello {    public Hello() {        super();    }    public int foo(int arg3, int arg4) {        return (arg3 + arg4) * (arg3 - arg4);    }    public static void main(String[] arg4) {        System.out.println(new Hello().foo(5, 3));    }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
CTF{16}
   
   
  • 1

逆向观察

这里写图片描述

还是比较明显的,就是再1000个密码中匹配是否存在 sedecrem,但是真的是这个嘛???答案是否定的,我们需要注意原来存放src的类型是int型!而我们将它看成char型是必须倒置的!!!
也就是说我们需要在程序中注入一个串和1000个字典中匹配,而且字典中必须存在 mercedes,查看之后发现确实是存在的!那么我们如果动态调试就只需要输入一个满足条件的字符串即可!
最终答案

mercedes
   
   
  • 1

Just Click

Exeinfo Pe进行加壳分析,发现是利用了c#写的,在分析结果中明确提出了应该用.NET Reflector去分析源代码!

这里写图片描述

真是涨了一波姿势啊,按顺序输入即可
这里写图片描述

这里还有一个小坑…这里的To要用大写….

simCTF{Easy_To_Get_Flag_From_DotNET}
   
   
  • 1

分道扬镳

非常有意思的题目,但是应该是不难的(要不然我也不可能会的),首先我们看到了由星号和空格组成的字符串,轻易的可以猜测出来应该是一个8*8的地图(因为后面的四种操作很明显)得到地图如下

********* *    ** * ** ** * ** ** * #* ** **** **      *********
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

然后我们还可以轻易地找到了起点是这里

这里写图片描述

然后后面就是肉眼观察规划路径即可!然后推算得到的输入应该是

jjjjjlllllkkkkkhhhjjjl
   
   
  • 1

我们看函数

这里写图片描述

里面有一个很诱人的东西….
这里写图片描述

这个是骗人的,python、脚本搞出来得到

#_*_coding:utf-8_*_a=[0xF4,0xE8,0xE9,0xF3,0xDF,0xE9,0xF3,0xDF,0xE1,0xDF,0xE6,0xE1,0xEB,0xE5,0xDF,0xE6,0xEC,0xE1,0xE7]flag=''for i in a:    flag+=chr(i+128-256)print flag#this_is_a_fake_flag
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

所以说…答案就是我们最开始得到的顺序

jjjjjlllllkkkkkhhhjjjl
   
   
  • 1

10000000

这个题目某明奇妙的简单,说白了就是非常直白的逆向,总共的代码如下

这里写图片描述

简单明了,就是一个字符串的匹配,非常简单,直接上代码了

#_*_coding:utf-8_*_import libnuma=[0xE7,0xE1,0xEC,0xE6]a=[0xE6,0xEC,0xE1,0xE7,0xBA,0xF4,0xE5,0xF3,0xF4,0xF4,0xE5,0xF3,0xF4]flag=''for i in a:    flag+=chr(i^0x80)print flag
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

该题不简单

真是没想到,一看题目难度说是难…还以为是爆炸,一看为啥全世界都会啊….感觉不对劲,使劲看啊看,发现其实很简单…首先我们试一试,找到关键字密码,顺势找到了判断的位置

这里写图片描述

就是这个!我开始直接看汇编没看出个所以然,我们反汇编一下看看就非常明显了!关键就是下面那个函数了
这里写图片描述

然后我们去审核一下那个函数,就是一个匹配就好了…晕死了…
这里写图片描述

通过其他工具可以知道1000框为用户名输入框,1001为 注册码输入窗口。直接上代码解密即可,很简单

#_*_coding:utf-8_*_import libnums='hello'flag ='Happy@'for i in range(len(s)):    flag+=chr((i+i*ord(s[i])*ord(s[i]))%0x42+33)print flag
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

证明自己吧

主函数直接了当

这里写图片描述

真是可以,关键就在这个4011BA这个验证的函数上了
这里写图片描述

其实还是一个简单的字符串匹配,轻轻松松写出脚本搞定…

#_*_coding:utf-8_*_flag=''a=[0x68,0x57,0x19,0x48,0x50,0x6E,0x58,0x78,0x54,0x6A,0x19,0x58,0x5E,0x06]for i in range(len(a)):    a[i]=a[i]-5for i in range(len(a)):    flag+=chr(a[i]^0x20)print flag
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

wzwzDingDing

这里写图片描述

首先看到类似和结果有一些联系的string串,然后看整个题目是一个驱动程序。

这个FLAG有点怪

终于解出来了,放给大家链接
http://blog.csdn.net/qq_35078631/article/details/78209447

1000

没什么说的,1000有特殊含义试一下8,在收藏夹下得到一个新文件,写着

G00dTh1sIske
   
   
  • 1

加上一个y即可

CTF{G00dTh1sIskeY}
   
   
  • 1

此处无声

这个题目首先PEiD打开看一下,没发现什么,但是我们用IDA反编译的时候却发现还有壳,进入ODB看一下发现大量的都是动态修改程序,然后动态跑出来的,所以没办法只能动态调试然后dump了。但是这个不是传统的UPX加壳了,我也不知道是什么壳子,所以只用了歪打正着的方法,首先观察一下,输入字符串一般用到了函数GetWindowText这个函数,用ODB下断电,然后F8一路调到一个函数中间,然后将这个函数的开始当做程序的OEP进行脱壳处理。就是这里

这里写图片描述

然后脱壳以后发现IDA可以成功编译,然后就是静态加上动态分析了,首先运行一下发现运行是不成功的。

这里写图片描述

有大概的提示,明白了有MD5和RC6算法,但是不知道RC6是啥,需要现查一下…然后我们进入IDA看到了start函数看到了这个
这里写图片描述

很容易猜测应该就是调用GetWindowTextA获得用户名和用户的激活码吧。然后看到这个sub_401960这个函数一路跟进去看到了函数
这里写图片描述

啥都不说了,就是MD5的初始化的哪一步吧,我估计就是处理MD5了,第一步提取的是注册用户名字nsfocus。然后我们看一下后面几个函数是干什么的


sub_401AA0  此函数之后得到了nsfocus的MD5值b9b7dd1c421e005bc9a7f70b848e3d0e

这里写图片描述


sub_401870   检测输入值是不是32位的,且必须只有0-9和A-E


sub_4018C0就是把输入的验证码(32位)两个字符一组拆成16组,然后做了这样的处理

ans +=  chr(第一个字符*16+第二个字符)
   
   
  • 1

这样的处理,这样就变成了一个16长度的字符串,其实就是转换成了hex值…


sub_4011F0  不知道是啥,但是16位,所以感觉是16位的密钥,从v3开始,总共取出16位,如下

[0x35,0x47,0x82,0x5c,0x33,0x8c,0x85,0x77,0x9a,0x67,0x45,0x7a,0x6d,0x5c,0x16,0x47]
   
   
  • 1

然后对密钥进行进一步的加工,如果需要程序解密就需要动态把这个东西爬下来了,得到了这个

这里写图片描述

这个东西IDA有点坑,反编译没出来,需要看汇编才能看出来…要不然感觉密钥给被吃了一样…


然后后面的sub_4011F0和sub_4012F0恐怕就是处理RC6的东西了
但是我们拉下了一个重要的参数就是密钥的默认r=20,这个很关键(一般是默认的,但是如果改了就非常坑了)


然后我们看判定的条件居然是注册码的RC6和nsfocus的MD5值进行比较。那么我们的32位的注册码如何恢复就很明确了

1.知道密钥,密文是b9b7dd1c421e005bc9a7f70b848e3d0e进行解密2.对得到的16位进行恢复
   
   
  • 1
  • 2

但是一直找不到RC6好用的程序额…github上面dump下来修改的结果都不对额…最后找到了网上一个小工具…

这里写图片描述

终于算是做出来了…首先考察的是 脱壳的知识,然后其实算是投机取巧了,如果没有提示MD5算法我能看出来,但是RC6有什么特征呢?所以还是见识太少了。
















           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43679818/article/details/86186548