这是我做reverse的题解。在咱逆向之路上的mark一下,,水平有限,大牛见笑。

题目及题解链接:http://pan.baidu.com/s/1gd3k2RL

宗女齐姜

果然是仅仅有50分的难度,OD直接找到了flag.

找到杀手

这题用OD做非常麻烦。我改用IDA了。又是秒破

将图中字符串输入,程序生成了四张扑克牌图片。题目让依据密文判断。就4个字符串,一个一个试最多4次就出来了,哈哈

避难母国

这题挺有意思的,总共要经过13次听取建议,太麻烦,在第一次是Andy后,以后都用改变寄存器状态的方式跳过剩下的环节。最后程序打印出flag。

流亡齐国

用不成OD了,用Reflector得到关键函数的源代码

但是我不会C#啊,找到精通C#的同学得到解密函数,并取得了flag.

何去何从

这题貌似简单。事实上就是简单,当然做出来了就感觉简单,事实上有一个陷阱,仅仅要发现了就OK了。

这道题非常有诱惑性,按正常的思路非常快就得到了一个flag-like的家伙。

是vc 6.0的程序,非常easy就找到了main函数

进入后

当中的凝视是所有做完后的凝视。第一遍时非常正常的跳过了当中凝视为“不能调”、“这才是关键”的那部分代码,进入了凝视为“关键进入”的函数,

这个函数首先经过0x13次的循环生成“(3q^;^3lfjq&D7V4Hhd”,然后与输入的字符串比較。相等则显示“是这个么”,不等则显示“错了”。似乎flag已经找到了,真对不起200分的价值是不是?,但是提交时却发现不对,难道要对这个字符串做什么变换么?仅仅能回去再细致看看程序了。

又到了这一步,按程序的意思是。jnz是一定会跳的,可是里边的两个函数有什么用呢,于是决定进去看看,强制改了跳转。F8跳过第二个函数后,程序打印出

,于是进去看看。

到了这一步,

再跟进去瞧瞧,

这和之前生成的那个0x13长的伪flag的生成算法是一样的。执行完后在内存中找到这个字符串“(3q&vf2vw%f7Vj9Ookj”,这个就是FLAG了!

逃离临淄

执行程序如图

在程序函数中找到了GetWindowTextA函数,下断点,

在编辑框中随便输入点东西后点“注冊”。到断点

调用两次这个函数。得到注冊名和注冊码。存在0x18CD98和0x18CDB8处

在下图这个函数中会对注冊码进行变形

进入后

004016C0  /$ 8B5424 04     mov edx,dword ptrss:[esp+0x4]

004016C4  |. 57            push edi

004016C5  |. 8BFA          mov edi,edx

004016C7  |. 83C9 FF       or ecx,0xFFFFFFFF

004016CA  |. 33C0          xor eax,eax

004016CC  |. F2:AE         repne scas byte ptres:[edi]

004016CE  |. F7D1          not ecx

004016D0  |. 49            dec ecx

004016D1  |. 83F9 1F       cmp ecx,0x1F                 推断长度是否为0x1f

004016D4  |.  7406         je XCrackMe?004016DC

004016D6  |. 32C0          xor al,al

004016D8  |. 5F            pop edi

004016D9  |.  C20800       retn 0x8

004016DC  |> 8B4424 0C     mov eax,dword ptrss:[esp+0xC]

004016E0  |. 53            push ebx

004016E1  |. 56            push esi

004016E2  |. 8BF2          mov esi,edx

004016E4  |. 8BC8          mov ecx,eax

004016E6  |. 2BF0          sub esi,eax

004016E8  |.  BF1F000000   mov edi,0x1F

004016ED  |> 8A040E        /mov al,byte ptrds:[esi+ecx]

004016F0  |.  3C30         |cmp al,0x30

004016F2  |.  7C17         |jl XCrackMe?

0040170B

004016F4  |.  3C39         |cmp al,0x39

004016F6  |.  7F13         |jg XCrackMe?

0040170B

004016F8  |. 0FBEC0        |movsx eax,al

004016FB  |. 83E8 2B       |sub eax,0x2B

004016FE  |.  BB0A000000   |mov ebx,0xA

00401703  |.  99            |cdq

00401704  |. F7FB          |idiv ebx

00401706  |. 80C2 30       |add dl,0x30

00401709  |.  EB34         |jmp XCrackMe?0040173F         (数字-2B)/ A 取余

0040170B  |> 3C 41         |cmp al,0x41

0040170D  |.  7C17         |jl XCrackMe?00401726

0040170F  |.  3C5A         |cmp al,0x5A

00401711  |.  7F13         |jg XCrackMe?00401726

00401713  |. 0FBEC0        |movsx eax,al

00401716  |. 83E8 34       |sub eax,0x34

00401719  |.  BB1A000000   |mov ebx,0x1A

0040171E  |. 99            |cdq

0040171F  |. F7FB          |idiv ebx

00401721  |. 80C2 41       |add dl,0x41

00401724  |.  EB19         |jmp XCrackMe?

0040173F         (大写-0x34) / 1A 取余

00401726  |> 3C 61         |cmp al,0x61

00401728  |.  7C17         |jl XCrackMe?

00401741

0040172A  |.  3C7A         |cmp al,0x7A

0040172C  |.  7F13         |jg XCrackMe?00401741

0040172E  |. 0FBEC0        |movsx eax,al

00401731  |. 83E8 54       |sub eax,0x54

00401734  |.  BB1A000000   |mov ebx,0x1A

00401739  |. 99            |cdq

0040173A  |.  F7FB          |idiv ebx

0040173C  |. 80C2 61       |add dl,0x61                 (小写-0x54) / 1A 取余

0040173F  |> 8AC2          |mov al,dl

00401741  |> 8801          |mov byte ptrds:[ecx],al

00401743  |. 41            |inc ecx

00401744  |. 4F            |dec edi

00401745  |.^ 75 A6         \jnz XCrackMe?004016ED

00401747  |. 5E            pop esi

00401748  |. 5B            pop ebx

00401749  |.  B001         mov al,0x1

0040174B  |. 5F            pop edi

0040174C  \.  C20800       retn 0x8

跳出这个函数后

下面都是对变形后的字符串进行的推断。

推断了三位。

再然后

是对后十位的比較,将后十位变成整形后与EDI比較。edi由下图函数得到

还好这个结果与后十位的内容无关。

当一切判定条件都通过后,就来到最后弹出对话框的地方。

这个注冊码vscc11-695356-695356-6494939865是2014年8月1日过期

这个注冊码是2015年八月1日到期  vscc11-695356-605356-6456326018

咱如今的逆向水平也就仅仅能做到这了,剩下的题希望能从大牛那里得到经验。也算从这次比赛得到的最大收获了。

ISCC2014-reverse的更多相关文章

  1. LeetCode 7. Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...

  2. js sort() reverse()

    数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...

  3. [LeetCode] Reverse Vowels of a String 翻转字符串中的元音字母

    Write a function that takes a string as input and reverse only the vowels of a string. Example 1:Giv ...

  4. [LeetCode] Reverse String 翻转字符串

    Write a function that takes a string as input and returns the string reversed. Example: Given s = &q ...

  5. [LeetCode] Reverse Linked List 倒置链表

    Reverse a singly linked list. click to show more hints. Hint: A linked list can be reversed either i ...

  6. [LeetCode] Reverse Bits 翻转位

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  7. [LeetCode] Reverse Words in a String II 翻转字符串中的单词之二

    Given an input string, reverse the string word by word. A word is defined as a sequence of non-space ...

  8. [LeetCode] Reverse Words in a String 翻转字符串中的单词

    Given an input string, reverse the string word by word. For example, Given s = "the sky is blue ...

  9. [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  10. [LeetCode] Reverse Linked List II 倒置链表之二

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

随机推荐

  1. ASM下裸设备的路径更改是否会影响数据库的执行

    通过asm来存储数据库文件,在linux下能够通过asmlib的方式来管理块设备,也能够直接使用裸设备来建立asm磁盘.在asmlib方式下,磁盘设备启动顺序和名称的改变不会影响到asm的使用.但假设 ...

  2. chm格式文件,win7下用c:/windows/hh.exe打开

    chm格式文件,win7下用c:/windows/hh.exe打开

  3. java科学计数法转换成普通计数法

    java科学计数法转换成普通计数法: String sjiachun = "12345E-10"; BigDecimal db = new BigDecimal(sjiachun) ...

  4. 安全删除U盘或其他硬件 unlocker的使用方法

    1 假如我在优盘里新建一个文档,并且正在读写文件. 点击右下角的安全删除的时候弹出如下对话框. 2 在该优盘上右击,Unlocker,弹出的对话框显示NOTEPAD.EXE正在使用. 3 在确保左侧是 ...

  5. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  6. lenovo E431 win8系统 安装win7

    事由:新买的lenovo e431 原装win8系统.win8系统本来就不好用,又傻傻的装了win10的预览版,丑死不说,还各种驱动不兼容,每次开机都提示不兼容——本人有点洁癖,见不得这种,本想把不兼 ...

  7. UITableViewCell 取消分隔线

    方法一: [historyTodayTableVC setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 方法二: [historyTodayTa ...

  8. SQL:1999基本语法(学习笔记)

    SQL:1999基本语法 SELECT [DISTINCT] * | 列名称 [AS]别名,........ FROM 表名称1 [别名1][CROSS JOIN表名称2 别名2]| [NATURAL ...

  9. java线程(上)Thread和Runnable的区别

    首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程. 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈 ...

  10. TFS2012强制解除迁出(数据库操作方式)

    同事离职,有个文件被迁出,查了好多资料终于解决. 在数据库中找到对应项目名字的数据库,例如Tfs_Project,记得先备份,保证删错了也能恢复~ 然后施行下列sql语句: --找到项目所在库 use ...