reversing.kr四道Easy

四道题,为一下链接中的四道Easy题(当做入门题真的很好很好啊)

http://reversing.kr/challenge.php

Easy Crack、Easy Keygen、Easy Unpack、Easy ELF

0x00 Easy Crack

首先,打开程序发现是要输入正确的password

1

于是,拖进OD中调试

在输入password后,会调用getDlgItemTextA函数获取password,于是在该函数下断点

然后我们会发现跳转到这里

2

我们可以看到cmp,不匹配的话会跳转到00401135,

3

于是,可以知道这就是password的验证过程。

分析其中比较的代码,可以得出几个部分(按顺序)

1.二位是否为a

2.三四位是否为5y

3.后面是否接着R3versing

4.第一位是否为E

所以便可得出password: Ea5yR3versing

0x01 EasyKeygen

下下来后,会看到这么一段

18

4

也就是说,我们得首先找出他的加密算法

拖进OD看,可以找到其加密的步骤,然而在汇编下看过于复杂,于是这里换种工具,进入到ida中查看

在main函数中按f5反编译成c代码

5

发现主要是这一段

v11为输入的name,可以看到其调用了C中sprintf的函数,再把结果存到v15,

再输入serial到v11与v15比较,而v8、v9、v10可判断为三个连续的量

6

于是定义char v8 = {16,32,48};

根据这段代码,可以还原其加密算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;
int main()
{
char name[] = "root";
char result[100];
char v8[] = {16,32,48};
int v3 = 0;
memset(result,0,sizeof(result));
for(int i=0;v3<strlen(name);i++)
{
if(i>=3) i = 0;
sprintf(result,"%s%02X",result,name[v3++] ^ v8[i]);
}
printf("%s\n",result);
return 0;
}

运行测试结果是正确的

8

根据上面进行的是每位与v8进行异或运算,于是可以写出逆向的算法

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
#include<bits/stdc++.h>
using namespace std;
int main()
{
char key[] = "5B134977135E7D13";
char num[] = {16,32,48};
char rel[100];
memset(rel,0,sizeof(rel));
for(int i=0,j=0;i<strlen(key);i+=2,j++)
{
if(j>=3) j = 0;
/* //注释内是我刚开始用极其愚蠢的方法写进制转换
//后来看别人的writeup才看到了strtol这函数
char tmp;
if(isdigit(key[i]))
tmp = (key[i]-'0')<<4;
else
tmp = (key[i]-'A'+10)<<4;

if(isdigit(key[i+1]))
tmp += (key[i+1]-'0');
else
tmp += (key[i+1]-'A'+10);

sprintf(rel,"%s%c",rel,tmp^num[j]);
*/
char tmp[3] = {key[i],key[i+1],'\0'};
sprintf(rel,"%s%c",rel,strtol(tmp,NULL,16)^num[j]);
}
cout<<rel<<endl;
return 0;
}

运行得出name:K3yg3nm3

0x02 Easy Unpack

Unpack即是脱壳,然而对脱壳一窍不通,但里面还包含了一个ReadMe

10

找到入口点,对这个没什么概念。

加壳:其实是利用特殊的算法,对可执行文件里的资源进行压缩,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。它们附加在原程序上通过加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。

来自 <http://baike.baidu.com/link?url=qQk8JUbxPi-5ze8aeSI05i-A2Q1dqJQ8ASyf2RwlkEyNc3HeBUFvTPFSv56-YOscDXBqG80FgpqBZ6ahcqFZF_>

看了看网上writeup,先拖进OD调试吧

发现运行到后面,突然来了个jmp 00401150

跳到这么一段地方

11

Ctrl + A 反汇编

得到

12

宛如一个正常程序的开始

于是00401150就是程序的入口点了

but…

这儿还有另外一个思路,就是拖进Peid直接查找(目瞪口呆.gif)

13

0x03 Easy ELF

查了一下,ELF是linux下的可执行文件

在linux中运行

14

可看出是一个检测密码的程序

因为文件格式为ELF,因此OD用不了的

拖进ida,再用f5

15

看到main函数是这么一个东西,点进sub_80484F7函数,发现是一个输出correct的函数

所以,最终就是看if条件里的函数了

16

然后看到一连好几个if,并且当不满足条件时return result都是0

上述变量都是char,于是我们猜测flag就在里面

1
2
3
4
5
6
7
8
9
10
11
#include<bits/stdc++.h>
int main()
{
char v1 = 120^0x34;
char v2 = 49;
char v3 = 124^0x32;
char v4 = -35^0x88;
char v5 = 88;
std::cout<<v1<<v2<<v3<<v4<<v5<<std::endl;
return 0;
}

按照地址顺序排序,输出,得到flag :L1NUX

至此,四道Easy题终结

×

赞助gif换电脑、吃双皮奶(逃

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 0x00 Easy Crack
  2. 2. 0x01 EasyKeygen
  3. 3. 0x02 Easy Unpack
  4. 4. 0x03 Easy ELF
    1. 4.0.1. 至此,四道Easy题终结
,