【RE】三个入门级RE的writeup

01 re0_0

首先用IDA64位打开文件,F5,发现神秘的judge函数。

【RE】三个入门级RE的writeup_第1张图片

judge函数被加密了,转到汇编,是个样子的,无法反编译。

【RE】三个入门级RE的writeup_第2张图片

这个时候取消judge的定义【快捷键U】,在IDA的python栏中输入代码如下。

judge=0x600B00 

for i in range(182): 

addr=0x600B00+i 

byte=get_bytes(addr,1) 

byte=ord(byte)^0xC 

patch_byte(addr,byte)

然后再定义函数judge【快捷键D】,这样,函数就可以F5了,我们会得到这样的代码。

【RE】三个入门级RE的writeup_第3张图片

阅读函数发现,v2-v15就是flag_encode,快捷键R把数字转化字符串,再写脚本得到flag。

flag_enc="fmcd\x7fk7d;V\x60;np"

flag=""

for i in range(len(flag_enc)):

c=flag_enc[i]

flag+=chr(ord(c)^i)

print flag

 

flag = flag{n1c3_j0b}

 

02 re1_1

首先在函数中查找窗口弹出的函数,然后查找其调用位置,不能反汇编,函数开头按P键即可f5反汇编。【RE】三个入门级RE的writeup_第4张图片

 

 

发现判断长度的语句,推断sub_401630为flag。

判断语句

【RE】三个入门级RE的writeup_第5张图片

 

然后动态调试,将flag每位值v3[v5 + 96 + v4]存到寄存器里。(f9->本地调试,按绿色箭头即可开始调试)【RE】三个入门级RE的writeup_第6张图片

 

输入33位长字符串,查看ecx寄存器的变化情况。(最后一位变动后寄存器位置会发生偏移,所以要提前做好记录)

03 evr

32位IDA打开,F5后发现main_0函数。

双击后,报错,快捷键G找到地址413238。

【RE】三个入门级RE的writeup_第7张图片

在汇编窗口找到。

【RE】三个入门级RE的writeup_第8张图片

利用快捷键alt + K 修复sp。【根据提示的value输入,如果第一处修复后还是无法反编译,那么往上尝试】

【RE】三个入门级RE的writeup_第9张图片

反编译成功后,找到程序入口,观察程序。

【RE】三个入门级RE的writeup_第10张图片

获得flag_encode。

【RE】三个入门级RE的writeup_第11张图片

【RE】三个入门级RE的writeup_第12张图片

【RE】三个入门级RE的writeup_第13张图片

 

 

转化为十进制:30, 21, 2, 16, 13, 2 ,72, 111, 2 ,221, 72, 100,99, 215, 46, 44, 254, 106, 109, 42, 242, 111, 154, 77,139, 75, 10, 138, 79, 69, 23, 70, 79, 20, 11

【RE】三个入门级RE的writeup_第14张图片

全部数都与0x76异或。

【RE】三个入门级RE的writeup_第15张图片

然后flag_encode分为五个部分进行不同的算法,写出脚本。

flag_enc=[30, 21, 2, 16, 13, 72, 72, 111, 221, 221, 72, 100, 99, 215, 46, 44, 254, 106, 109, 42, 242, 111, 154, 77, 139, 75, 10, 138, 79, 69, 23, 70, 79, 20, 11];



flag=""

for i in range(7):

flag+=chr(flag_enc[i]^0x76)

for i in range(7):

for c in range(0x20,0x7f):

origc=c

c=c^0x76^0xad

c=((2*c)&0xff)&0xaa|(0xff&((c&0xaa)>>1))

if c==flag_enc[7+i]:

flag+=chr(origc)

break

for i in range(7):

for c in range(0x20,0x7f):

origc=c

c=c^0x76^0xbe

c=((4*c)&0xff)&0xcc|(0xff&((c&0xcc)>>2))

if c==flag_enc[14+i]:

flag+=chr(origc)

break



for i in range(7):

for c in range(0x20,0x7f):

origc=c

c=c^0x76^0xef

c=((16*c)&0xff)&0xf0|(0xff&((c&0xf0)>>4))

if c==flag_enc[21+i]:

flag+=chr(origc)

break

for i in range(7):

flag+=chr(flag_enc[i+28]^0x76)

print flag



flag = hctf{>>D55_CH0CK3R_B0o0M!-9193a09b}

 

你可能感兴趣的:(【RE】三个入门级RE的writeup)