前言
此篇文章记录了我对Reversing.kr
网站的解题过程,有的直接看的wp,有的自己复现了一遍。
先开个头,后续会慢慢补充。
题解
0x0 Easy_CrackMe
Ea5yR3versing
0x1 Easy_KeygenMe
K3yg3nm3
0x2 Easy_UnpackMe
00401150
0x3 Music_Player
LIstenCare
这几题比较简单直接贴上答案
0x4 Replace
ida
打开,定位到关键字符串,向上回溯,下断,跟了一遍,程序在0040466F mov byte ptr [eax], 90h
处报错,结合逻辑分析,eax
和我们的输入相关,0x90
代表着nop
,继续往下看调用堆栈。
最后要跳转到loc_401071
,为了到达correct
处,我们需要将loc_401071
处的代码nop
,通过程序自身代码就可以做到,我们只需使eax==0x401071
即可。
答案:2687109798
0x5 ImagePrc
。。写着写着忘记保存了,东西都丢了。还是定位到关键函数,然后找到对比的资源文件,这里建议使用resourcehacker
工具将资源文件dump
下来,然后写个简单的脚本即可。
from PIL import Image
width = 200
height = 150
image_file = open('Data_1.bin', '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()
答案:GOT
0x6 Easy ELF
很简单的不想写了
答案:L1NUX
0x7 ransomware
首先upx
然后又是一堆花指令,写个简单的ipython
脚本patch
一下,这里还是需要手动的修改函数头55 8B EC 83 EC 24 53 56 57
,然后使用ida
重新f5
一下便可以看到反编译后的结果。
但是这个sub_401000
函数还是被加了花,但是对逆向程序逻辑没有影响。
主要的加密过程,这里需要得到key
值,观察pe
文件可以看到题中给的hint
,找到file
文件对应的位置,解密得到key
enc='C7F2E2FFAFE3ECE9FBE5FBE1ACF0FBE5E2E0E7BEE4F9B7E8F9E2B3F3E5ACCBDCCDA6F1F8FEE9'.decode('hex')
dec='This program cannot be run in DOS mode'
key=''
enc = list(enc)
dec = list(dec)
for i in range(len(enc)):
enc[i] = (~ord(enc[i]))&255
key += chr(ord(dec[i])^enc[i])
print key
letsplaychess
最后解密file
文件,得到exe
文件,运行即可以得到flag
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)
答案:Colle System
(我感觉如果没有提示有点脑洞了,看着wp写的)
0x8 CSHOP
这题有点神 输入一个空格 就可以看到 flag
》??
不过还是有必要了解这个文件格式的CSHOP.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
./net
框架,采用c#
编写,使用dnSpy
进行反编译,然后可以修改IL
指令。感觉这个dnSpy
工具还是用的少。
答案:P4W6RP6SES
0x9 Direct3D_FPS
我的电脑上无法运行这个程序,只能静态分析了,ida
分析字符串,交叉引用到byte_407028
其中byte_407028
的数据十分的可疑,但是无法确定result
为何值,向上回溯,可以发现sub_403400
在一个循环体中,可以猜测result
是o-len(byte_407028)
,但是另一个角度来说,result
和v2*4
是线性关系,所以影响不大。
但是问题来了,通过交叉引用byte_409184
发现此数据只有读的引用,没有写,因此在程序初始化时,此数据将被初始化,那么之前说了,我无法运行此程序,因此我在程序init
下断,查看此时的byte_409184
数据,我这里显示的都为0,但是我看wp却说是存在byte_409184[528*i] = 4*i
这样的关系。
23333.
flag_c='436B666B62756C694C455C455F5A461C07252529701734390116494C20150B0FF7EBFAE8B0FDEBBCF4CCDA9FF5F0E8CEF0A9'.decode('hex')
flag_d=''
for i in range(len(flag_c)):
flag_d += chr(ord(flag_c[i])^4*i)
print flag_d
#Congratulation~ Game Clear! Password is Thr3EDPr0m
0x10 HateIntel
mac
下的程序,但是我没有mac
的电脑,pizza来说静态看就是了,不过程序也简单,通过字符串,定位到关键函数(我经常这么写,因为确实是这么做的!)
算法不可逆,但是可以逐字节爆破,脚本也简单,注意下uint_8
变量范围0-256
即可。
dic = [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, 0x00]
flg = ''
for j in range(len(dic)):
for fl in range(256):
k = fl
for i in range(4):
tmp = (k*2)
if tmp&0x100:
tmp |= 1
k = tmp%256
if k == dic[j]:
flg +=chr(fl)
print flg
答案:Do_u_like_ARM_instructi0n?:)
0x11 Flash Encrypt
下载ffdec
工具同样的分析字符串,依次输入1456,25,44,8,88,20546
这题我没有复现,flash打不开。
答案:16876
0x12 Position
这题之前做z3
总结的时候做过,写出约束条件,然后z3
求解即可
from z3 import *
username = [BitVec('u%d'%i,8) for i in range(0,4)]
solver = Solver() #76876-77776
solver.add(((username[0]&1)+5+(((username[1]>>