Reversing.kr 1-3

Catalpa 网络安全爱好者

Reversing.kr 上面的题目。

01 Easy Crack

基础题,不需要动态分析,直接丢到IDA中,Shift+F12搜索字符串,发现有 “Congratulation !!” 以及 “Incorrect Password” 的字样,定位到相关函数,就能看到处理逻辑:

image

读取输入直接和硬编码的flag进行比较,唯一的坑点在于比较的顺序,细心观察发现,变量v3 v4 v5 以及string 其实应该是一个数组,但是IDA错误的将其解析为了char型变量,我们单机string,并按下Y键,修改变量类型:
image

再来看就清晰多了:
image

那么flag就是: Ea5yR3versing

image

测试成功。

02 Easy Keygen

简单的注册机编写,依旧无需动态调试,直接丢到IDA中看,老方法,将主函数的变量进行修复:

image

根据逻辑整理出注册机:

1
2
3
4
5
6
7
8
9
10
# python2.7
from __future__ import print_function
name = raw_input("please input a name:")
token = [0x10,0x20,0x30]
index = 0
for i in name:
if index >= 3:
index = 0
print("%02X" % (ord(i) ^ token[index]) ,end="")
index += 1

运行代码就能计算任意用户名的注册码:

image
image

但是题目要求我们找到注册码为 **“5B134977135E7D13” **的用户名,暴力破解即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for i in range(0,256):
if i ^ 0x10 == 0x5B:
print("%c" % i)
for i in range(0,256):
if i ^ 0x20 == 0x13:
print("%c" % i)
for i in range(0,256):
if i ^ 0x30 == 0x49:
print("%c" % i)
for i in range(0,256):
if i ^ 0x10 == 0x77:
print("%c" % i)
for i in range(0,256):
if i ^ 0x20 == 0x13:
print("%c" % i)
for i in range(0,256):
if i ^ 0x30 == 0x5E:
print("%c" % i)
for i in range(0,256):
if i ^ 0x10 == 0x7D:
print("%c" % i)
for i in range(0,256):
if i ^ 0x20 == 0x13:
print("%c" % i)

flag: K3yg3nm3

image

03 Easy Unpack

第三题稍微增加了一些难度,是一道加了壳的题目,要求找到程序的OEP(原始入口点),IDA直接打开会报这个错误:

image

提示我们程序可能被加壳或修改,这时,常规的操作就不够了,我们掏出 PEID来查一下程序可能加了什么壳:

image

很遗憾,程序所加的壳并不是已知的壳,但是这不妨碍我们去尝试脱壳,OD载入程序,这里采用 “单步跟踪法” 进行脱壳(详细请百度了解),遇到向上的跳转就使用F4运行到下一句代码,直到找到一个长跳转(或称远跳转),基本就找到了OEP:

image

在这里可以看到很明显的长跳转,那么 OEP 可能就是 00401150
尝试提交,结果正确。

拓展:尝试脱掉这个未知的壳。

请在WIN XP 或者 WIN 7 脱壳

由于这个壳看上去并不复杂,应该可以脱掉,按照以下步骤操作:

  1. 在OD中运行到 OEP 处。
  2. 打开 LordPE ,尝试转储程序镜像:
    image
    注意,要先修正镜像大小!即使有些时候修复前后的程序并没有变化。
  3. 打开 Import REC ,尝试修复程序的 IAT:

image
这里要附加到还在OD中处于调试状态的目标程序,然后手动修正OEP。
注意:不能直接填写OEP,如 00401150,而是要将OEP减去 00400000(一般来说),因为这里需要填写的其实是 RVA,但是OD中看到的是 VA,RVA即 相对虚拟地址,VA即虚拟地址,他们与PE结构有关,有兴趣可以详细了解。
再点击IAT自动搜索,就能够找到程序调用的DLL,一般情况下是需要将无效指针(图中显示的)删除或手动修复,但是本例中观察无效指针发现,它们都是真实存在的,所以不需要进行多余操作,直接修正转储即可,在导出文件时选择第二步 dump 下来的文件,就能得到脱掉了壳的程序啦。

image

程序可以正常运行,再次使用IDA打开,也没有加壳提示了,相关的函数也成功修复:

image

想要详细了解如何脱壳可以自行百度。

  • Title: Reversing.kr 1-3
  • Author: Catalpa
  • Created at : 2018-09-02 00:00:00
  • Updated at : 2024-10-17 08:53:16
  • Link: https://wzt.ac.cn/2018/09/02/reversingkr1-3/
  • License: This work is licensed under CC BY-SA 4.0.
On this page
Reversing.kr 1-3