[2019红帽杯]easyRE WP

[2019红帽杯]easyRE

查壳

image-20241027144149739

无壳,64位elf文件

分析

首先没找到什么有用的函数,用shift + 12搜索字符串

image-20241027144313145

定位这个字符串

x追踪到函数

image-20241027144347396

首先关注这里第一个for循环,按tab到汇编界面查看

image-20241027145347850

这是个简单的异或,写一下脚本

a = [73,111,100,108,62,81,110,98,40,111,99,121,127,
     121,46,105,127,100,96,51,119,125,119,101,107,
     57,123,105,121,61,126,121,76,64,69,67]
hint = ''
for i in range(len(a)):
    hint += chr(a[i] ^ i)
print(hint)

得到hint : Info:The first four chars are flag

第二个加密

image-20241027145512241

跟进sub_400E44函数

image-20241027145550894

查看里面的aAbcdefghijklmn字符串:

image-20241027145612961

很明显这是一个base64加密

off_6CC090变量进行解密

十次base64解密

得到https://bbs.pediy.com/thread-254172.htm

点进去是看雪论坛的一篇文章,但没有什么与flag有关的内容

后面其实就没思路了,后面也是看的别的大佬的wp:

最后加密

点进off_6CC090

image-20241027150535982

这里还有一大串字符串,对着变量名按x找到函数,f5反汇编

image-20241027150620747

直接关注这个for循环

 if ( (v1 ^ byte_6CC0A0[0]) == 'f' && (HIBYTE(v4) ^ byte_6CC0A3) == 'g' )
  {
    for ( j = 0; j <= 24; ++j )
      sub_410E90((byte_6CC0A0[j] ^ *(&v4 + j % 4)));
  }

这里最主要是拿byte_6CC0A0v4进行异或

byte_6CC0A0是已知的

现在就是要求v4

关注上面的if判断,让v1第一个字节与byte_6CC0A0[0]进行异或和让v4(v4就是v1)高字节(也就是最后一个字节与byte_6CC0A3第一个字节进行异或,分别得到字符f和g

因此猜测v4与byte_6CC0A0前四字节进行异或得到字符串flag(逆向七分技术三分猜说是)

为什么v4是四字节,可以从这里看到v4是unsigned int变量,从其在rsp寄存器中的位置也能知道他是4字节

image-20241027151551153

因此便可写脚本得到v4并进行后面的for循环异或得到flag

enc = [0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]
key = []
enc2 = 'flag'
flag = ''
for i in range(len(enc2)):
    key.append(ord(enc2[i]) ^ enc[i])
for i in range(len(enc)):
    flag += chr(enc[i] ^ key[i % 4])
print(flag)

flag{Act1ve_Defen5e_Test}

posted @ 2024-10-27 15:25  结城希亚  阅读(1)  评论(0编辑  收藏  举报