reversing.kr 开坑(目前完成19题)暂时断更,自闭ing……

肝就完事了……

1.Easy Crack

拖进IDA

四段拼起来就好。注意顺序

2.Easy Unpack

让我们找OEP,OD启动

直接OEP定律就好

3.Easy Keygen

Find the Name when the Serial is 5B134977135E7D13

拖进IDA

关键操作就是一个异或,如下

3步一轮回,密钥盒子[0x10,0x20,0x30]

唯一可能误导的就是那是一个字节一个字节异或的,而不是一个字母一个字母异或的

4.Easy ELF

看见做出来的人很多,就先做了

拖进IDA,稍微分析一下

其实就是你输入的字符串要满足check函数,看一下check函数

easy

s=chr(120^0x34)+chr(49)+chr(124^0x32)+chr(221^0x88)+chr(88)                                  
print(s)

5.Replace

打开是一个exe

IDA拖进去貌似很奇怪,但并没有壳,直接OD

靠字符串定位到判断处

分析了一波之前多有的跳转和判断,总觉得不可能跳转到correct,而且我只能输入数字,基本就是把那两个阻碍我们跳转到correct的jump解决掉应该就可以了

收完消息之后判断函数应该就是40466F,跟进去看一下,最后就是jmp 到401071,所以我们需要通过我们输入的值让401071变成nop,但是在这段区域单步调试的时候还是炸了,里面40466F又炸了一次,再次跟进去

这里就是传递一个nop指令(0x90),那我们把eax改成401071就可以了,此时eax是60160646,输入是123

如果输入的是0,eax是601605CB,正好相差123,nice,那我们输入2687109798就可以吧eax改为0x401071了

6.Music Player

应该是只要bypass就可以看见flag了

用peid的时候发现这个是vb,直接瑞弹窗框在OD中下断点

第一次卡死,暂停看堆栈,发现box在4045D8,向上翻有个跳转语句,直接改成jmp如下

然后运行到最后,又有个弹窗

老样子,一样的操作就好

然后在MP3 Player的地方会出现password

7.CSHOP

打开后就是如图所示,很诡异,不知道要干嘛,PEID一波,发现是C#

直接dnspy反编译看看咋回事

这咋看,看不懂啊……在里面慢慢找吧

最后在资源里面看到了一个button,eng?还有按钮,仔细一看,大小被调成0了,还有tabindex=0,按空格键相当于点击按钮

点击一下空格出现答案

8.Flash Encrypt

因为是flash,很好奇,就来看看,结果发现有现成的工具ffdec,反混淆之后直接按照提示输入数字就好…………

数字:1456,25,44,8,88,20546

9.HateIntel

一道苹果的,IDA真的tql,还是可以反编译,题目提示如下

靠字符串定位到关键函数,如下

先看一下dict(byte_3004)

232C就是加密函数,跟进去

显然看出来要加密4轮,而且每轮最后一部分不用加密,跟进2494

或运算,是个不可逆的操作,看来只能爆破了

脚本

s=[0x44, 0xF6, 0xF5, 0x57, 0xF5, 0xC6, 0x96, 0xB6, 0x56, 0xF5, 0x14, 0x25, 0xD4, 0xF5, 0x96, 0xE6, 0x37, 0x47, 0x27, 0x57, 0x36, 0x47, 0x96, 0x03, 0xE6, 0xF3, 0xA3, 0x92]

flag=''

def cal(key):
    for i in range(32,256):
        k=i
        for j in range(4):
            tmp=2*k
            if(tmp&0x100):
                tmp|=1
            k=tmp%256    #python margin
        if(k==key):
            return chr(i)

for i in range(len(s)):
    flag+=cal(s[i])

print(flag)

10.ImagePrc

我自己觉得是很诡异的一道题

这啥东西,先看一下有没有壳,无壳,拖进IDA

靠一个wrong,找到核心代码,前后看了看,这都是啥……

大概能看懂的就是这句注释,跳出来一个错误的弹窗,那么判断应该在前面不远处吧……应该就是上面的while和if吧

然后再之前又找到了一块代码

百度了一下BeginPaint是准备画图,那应该是图片的比较吧……这题真的是迷茫,看不太懂,只知道宽200,高150

先把程序里面的图片dump下来吧,这里用exescope

直接上python脚本,这脚本我是看不懂的,但是很有用,涨姿势了,可以学一首python对图片的操作,直接python3跑哦

from PIL import Image
 
width = 200
height = 150
 
image_file = open('_dump', 'rb')
data = image_file.read()
image = Image.frombuffer('RGB', (width, height), data, 'raw', 'RGB')
image = image.transpose(Image.FLIP_TOP_BOTTOM)
image.show()
image_file.close()

结果如下

11.Direct3D FPS

看上去像是射击类游戏?

我打人不掉学,他也不打我,不会玩

拖进IDA,靠字符串定位

比较有用的应该就是这个byte_407028了,查看一下交叉引用

看见有一个异或操作

先看一下409184处的字典,静态状态下是未知的,看一下407028出的字典,存在

这里耍了一个小花招,其实403440函数只能返回0或者-1,0的时候才能运作,所以其实v2=0,当作i就好了,easy

s=[0x43, 0x6B, 0x66, 0x6B, 0x62, 0x75, 0x6C, 0x69, 0x4C, 0x45, 0x5C, 0x45, 0x5F, 0x5A, 0x46, 0x1C, 0x07, 0x25, 0x25, 0x29, 0x70, 0x17, 0x34, 0x39, 0x01, 0x16, 0x49, 0x4C, 0x20, 0x15, 0x0B, 0x0F, 0xF7, 0xEB, 0xFA, 0xE8, 0xB0, 0xFD, 0xEB, 0xBC, 0xF4, 0xCC, 0xDA, 0x9F, 0xF5, 0xF0, 0xE8, 0xCE, 0xF0, 0xA9]

flag=''

for i in range(len(s)):
    flag+=chr(s[i]^(i*4))

print(flag)

Congratulation~ Game Clear! Password is Thr3EDPr0m

12.Position

看一下提示

题目多解,只有四位,最后一位是p

打开exe,是一个经典的crackme

拖进IDA,没有找到有用的字符串

不死心,换OD重新找

找到了,很奇怪,那回IDA重新找就找到了,如下

401740应该就是check函数了,跟进去看……

输入的name要是4位,而且要是小写的字母,我们已经知道1位了,继续看下面的逻辑

这样的有四段,name[0]~name[3],全是位运算,爆破

先爆破第一段

serial='76876-77776'

for i in range(ord('a'),ord('z')+1):
    for j in range(ord('a'),ord('z')+1):
        v6 = i #name[0]
        v7 = (v6 & 1) + 5
        v48 = ((v6 >> 4) & 1) + 5
        v42 = ((v6 >> 1) & 1) + 5
        v44 = ((v6 >> 2) & 1) + 5
        v46 = ((v6 >> 3) & 1) + 5
        
        v8 = j #name[1]
        v34 = (v8 & 1) + 1
        v40 = ((v8 >> 4) & 1) + 1
        v36 = ((v8 >> 1) & 1) + 1
        v9 = ((v8 >> 2) & 1) + 1
        v38 = ((v8 >> 3) & 1) + 1

        if (v7 + v9==int(serial[0]))and(v46 + v38==int(serial[1]))and(v42 + v40==int(serial[2]))and(v44 + v34==int(serial[3]))and(v48 + v36==int(serial[4])):
            print(chr(i)+chr(j))

结果如下

bu
cq
ft
gp

直接猜答案啊bump  撞击

13.Ransomware

原文件是exe

这是什么鬼呀…………

upx壳,脱掉

拖进IDA

emmmmmm,也太秀了吧,虽然我很菜,我也能看出来这些都是花指令

这里我的IDA编译过来有点问题,不过是能看出来是pushad和popad,写脚本去花

先把这些汇编指令转成16进制数

from pwn import *
shellcode='''
pushad;
popad;
nop;
push eax;
pop eax;
push ebx;
pop ebx
'''
flag=''
shellcode=asm(shellcode)
for i in shellcode:
    flag+=str(hex(ord(i)))

print flag.replace('0x','\\x')

#\x60\x61\x90\x50\x58\x53\x5b

搞定之后再写个脚本把这些替换成nop(\x90)

data = open('run.exe','rb').read()
data = data.replace('\x60\x61\x90\x50\x58\x53\x5b','\x90\x90\x90\x90\x90\x90\x90')
open('run_new.exe','wb').write(data)

再次拖进IDA分析,发现还是太大

之后改下main()的起始地址  改到nop指令结束的位置   再改下使堆栈平衡就可以F5了

打开之后开头就是打开文件再改之类的,既然都是nop就先不管了

加密的函数应该就是如下这块,能看出来是一个异或外加取反的操作

但是byte都是不可见的,要想办法找出来,毕竟没有密钥什么是也干不了

提示说用file来解密,而且file是个exe,看看有啥东西拿来到密钥,我一般性是喜欢直接用最后的字符串的,因为对应的一定都是0,很方便

偷个懒,直接最后一行

s=[0x97, 0x9A, 0x8C, 0x8C, 0x93, 0x9A, 0x8B, 0x8C, 0x8F, 0x93, 0x9E, 0x86, 0x9C, 0x97, 0x9A, 0x8C]
#all they corresponding are 0
for i in range(len(s)):
    print(chr((0xFF^s[i]^0)%256),end='')

密钥应该是有意义的,我猜测应该是letsplaychess

拿到密钥解密回去就好了

data_c = open('file','rb').read()
data_d=''
key='letsplaychess'
key_len = len(key)
for i in range(len(data_c)):
    data_d += chr(ord(key[i%key_len])^(~ord(data_c[i]))&255)

open('file.exe','wb').write(data_d)

本题参考:https://veritas501.space/2017/03/04/Reversing.kr%20writeup/

14.AutoHotkey1

答案估计是两个md5当中用空格连接

查壳发现有upx,脱壳后运行

拖进IDA搜索字符串

继续查看4508C7函数,是个自校验函数,直接改跳转跳过就好

但是有一个细节,在自校验函数中,有一个函数450ABA,被多次调用,很可疑,查看一下,一大堆位运算,非常疑似加密函数,如下

直接在OD中对它下断(未脱壳),防止跑飞,我还在之后的retn下断了,经过多次F9,感觉实在这个函数循环了一会儿,出现了如下的字符串

md5解密后得到:pawn

答案是靠谱的

这个是我们运算过后的,所以这只是一半,还有一半应该实在运算前

我们可以在第一次运算前直接查看EDI,发现并没有,但总要有个地方吧,一边解密一边查看左右寄存器,在第一次执行完后的EBX找到了,如下

md5解密:isolated

搞定,拼起来记得加空格

15.x64 Lotto

eng?奇怪,是个exe

貌似peid不太支持x64查壳,我选择直接拖入IDA

这段wsystem('cls')意思是清屏,我们可以输入六个整数,所以我们输入什么都不为所动

判断方法如下

基本就是这么个流程,还算比较清晰,接下来就是生成flag的操作

接下来是一段异或操作,有点麻烦的就是,需要异或的字节的实际顺序和存放顺序是不一致的,好在IDA帮我们写了标号,算是帮大忙了,不用去动态调试了,大概流程如下

s= [184, 92, 139,  107, 66, 184, 56, 237, 219, 91, 129, 41, 160, 126, 80, 140, 27, 134, 245, 2, 85, 33, 12, 14, 242]
d = [231, 51, -11, 20, 62, 221, 91, 191, 204, 52, 231, 51, -11, 20, 62, 221, 91, 191, 204, 52, 68, 100, 20, 73, -12]
for i in range(len(d)):
    if(d[i]<=0):
        d[i] = d[i] + 256
for i in range(len(s)):
    print (chr((s[i] ^ d[i] ^ 0xF) + i),end='')

后来貌似看大佬的做法发现是可以动态调试的,我用x64dbg试试看,我佛了,直接nop,jmp爆破搞起来啊,或者用IDA也可以

后来发现还是IDA好用,真香

16.WindowsKernel

顾名思义,我应该是脑子被抢打了,才来看内核的题目,主要是好奇,从来没接触过

万幸还算是有提示:

请对小写进行身份验证,不知道啥意思,但是可以知道有身份验证

一开始是验证不通过的

在IDA里面搜索字符串也没搜出个什么,万幸函数比较少,一个个看,看到个类似于检验的函数

判断的关键就是函数401280,跟进去看一下

DeviceIoControl如果操作成功完成,DeviceIoControl将返回一个非零值

基本上可以看出来,如果指令是0x1000,进入check模式,当指令为0x2000,判断正误

咋办呀,看看别的函数吧

首先看到了一个hint

没思路了,难受……

17.PEPassword

这道题目打开以后发现了两个exe,根据题目名字猜测,一个是加密前的原始文件,另一个是加密后的文件

先看一下PEID,要是是个有名的壳,直接脱就行了,不BB,不过既然给了原始文件,那肯定没这么容易

这是啥,打扰了

打开Packed.exe,只有一个输入密码的地方,没有空间,下断点就比较困难了,不过总能找到的,OD启动

注:bp TranslateMessage MSG==WM_KEYDOWN,WM_KEYDOWN是windows键按下消息——WM_KEYDOWN

同时我们还可以看见执行第一条指令的时候程序就启动了,所以一开始就直接F7

可以看到这里有个getmessageA,要极度小心,这里而且是一个循环体,很有可能就是读入输入数据的地方,这个je回调到循环体之外,可以理解为check失败了

而且这里有两个函数值得注意:

1)TranslateMessage----函数功能描述:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出

2)DispatchMessage----该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是WindowProc函数。windowProc函数是一个应用程序定义的函数。它处理发送给窗口的消息

In conclusion:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理

对着这一块在IDA里面分析,不过这次不能F5,直接看汇编,稍微硬核一些

这里402A3E是cmp要关注,而且还有交叉引用,看一下

用了edi的值,动调跟一下,在前面一点下断点

到409197时,在esi中出现了我们输入的数据xiaoyuyu,猜测函数4091D8就是校验函数,在IDA中,只能看到一个xor从左,如下

只能跟进OD看,之后有个判断是用eax与0xE98F842A判断是否相等

在函数里看了半天还是直接爆破算了,看不懂啊……这辈子都看不懂的

关键的操作函数从409200开始

其实就是两个异或操作,eax和ebx我们要是知道就没问题了,eax提示我们实在401000处,在原文件可以找到

解密的数据从401000开始,一次解密4个字节,在这之前又根据输入的password计算了两个值,分别放在eax和ebx,由于有原始数据和加密后的数据,因此可以得到正确的初始eax

我们看一下原始文件401000处的字节81EC5657B9080000

现在是172EE6B6057E0C0D,则eax[0]=0xb7aac296;eax[1]=0x5a5a7e05;eax[2]=0x99c51d27

ebx就只能爆破了

这里有个牛逼的操作,用VS写内联汇编,和pwntools里的asm有点像

#include <stdio.h>
#include<stdlib.h>

void get_eax(int *result) {
	int result_eax = 0, result_ebx = 0, input_eax = result[0], input_ebx = result[1];
	__asm {
		mov eax, input_eax
		mov cl, al
		mov ebx, input_ebx
		rol ebx, cl
		xor eax, ebx
		mov cl, bh
		ror eax, cl
		add ebx, eax
		mov result_eax, eax
		mov result_ebx, ebx
	};
	result[0] = result_eax;
	result[1] = result_ebx;
}

int main() {
	int first_eax = 0xb7aac296;
	int second_eax = 0x5a5a7e05;
	int third_eax = 0x99c51d27;
	int i = 0;
	int result[2] = { 0 };
	while (i <= 0xffffffff) {
		result[0] = first_eax;
		result[1] = i;
		get_eax(result);
		if (result[0] == second_eax) {
			get_eax(result);
			if (result[0] == third_eax) {
				printf("ebx:0x%p\n", i);
				break;
			}
		}
		i++;
	}
	system("pause");
	return 0;
}

结果如下

手动修改eax,和ebx就好了

参考链接:http://www.mottoin.com/article/reverse/88578.html

收获是真的大,知道了内联汇编以及一些文件转换的思路,而且这次不能F5,硬走了一波汇编的思路,受益匪浅

18.AutoHotkey2

这题提示是要修复文件

这题也有UPX壳,脱壳拖进IDA,然后老样子靠字符串定位,还是有个自校验函数,这次要恢复文件,要好好的分析这个函数了

接下来校验

很神奇,绕来绕去的,看了我半天

理清楚之后直接找那16个字节地址偏移,如下

找到是0x00032800,改到倒数5-8字节就好了

然后在OD里看一下新的校验值也改掉就好了

最后写入的8个字节是00 28 03 00 33 C6 2B 36

文件打开如下

这啥啊,这谁,原来还要做题的么,貌似是权力的游戏:jonsnow

19.Multiplicative

用jad直接看源码,如下

思路还是简单的,百分百溢出了,写脚本逆向,只要爆破高位就行

脚本都差不多,就直接拿别人的了,链接:https://blog.csdn.net/qq_33438733/article/details/82108961

i = 1

while(1):
    k = i*2**64  + 0xEAAEB43E477B8487
    if(k % 26729 == 0):
        print(k)
        print(k/26729)
        print(2**64-k/26729)
        break
    i += 1

20.Twist1

这题我真的是233了

提示如下

不管,直接OD,有壳,找OEP

然后继续单步会找到处罚程序运作的地方再次下断点

然后查找字符串定位

可以看到有一个关键的跳转,怀疑401240就是check函数,打断点F9,跑飞了,重来……

又跳到40720D

发现了一个关键的反调试,而且貌似在WIN 10无效,不知道该怎么弄,乖乖的跟着教程,把这个反调试里面的关键的值改掉

太坑了,直接看跳转到哪里好了,如下

里面你有一大堆异或操作

把ebx(input)倒数最后一个字节取出来和0x36异或

这个操作可以学习一波,判断和0x36异或之后是最后一个字节否等于0,如果是的话,证明最后一个字节是0,则原先只有6位

然后继续往下看,从如下所示还是对输入进行异或操作

这种与0x77异或之后等于0x35(答案:B)的操作有一不少的,要一个个看过去

我刚开始发现凑不够六位是因为一开始就漏了,很迷,

答案:RIBENA

参考链接:http://www.mottoin.com/article/reverse/88447.html

21.MetroApp

这题没有环境,就静态看了

提示如下

做到现在感觉自己马上就要弃坑了,题目越来越难,有一些只能看到WP才能有思路了,有些甚至照着复现都已经是很难了

先把appx用ZIP打卡,可以看到一个exe

运行不了,直接拖进IDA

函数一大堆,直接搜字符串,出了个string too long 我啥都没找到……

给个链接吧:https://blog.csdn.net/whklhhhh/article/details/78291092

猜你喜欢

转载自blog.csdn.net/qq_42192672/article/details/84800940