히공

BlueHens CTF 2021 - Entropy 본문

write up/BlueHens CTF 2021

BlueHens CTF 2021 - Entropy

heegong 2021. 3. 22. 22:58
728x90

문제

 

 

 

 

 

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  char v3; // bl
  int i; // [rsp+14h] [rbp-2Ch]
  __int64 v6[5]; // [rsp+18h] [rbp-28h] BYREF

  v6[2] = __readfsqword(0x28u);
  puts(a2[1]);
  v6[0] = *(_QWORD *)a2[1] & 0xFFFFFFFFFFFFLL;
  printf("%lu\n", v6[0]);
  for ( i = 0; i <= 99; ++i )
  {
    v3 = unk_201020[i];
    unk_201020[i] = v3 ^ sub_6FA(v6);
  }
  if ( v6[0] == 0xFD94E6E84A0ALL )
    puts("looking good");
  v6[1] = (__int64)unk_201020;
  (*(void (**)(void))unk_201020)();
  return 0LL;
}

메인 함수

for문을 100번 돌려서 암호화 하면서 unk_201020과 xor하는 것을 알 수 있다.

v6[0]이 0xFD94E6E84A0A이 되어야 한다.

 

 

 

 

 

 

 

 

 

 

sub_6FA 함수

v6의 0번째 값을 바꾸고 리턴 하는 것을 알 수 있다.

 

 

 

 

 

 

 

from z3 import *

def ru(a2):
    for i in range(100):
        a2 = (0x5DEECE66D * a2 + 11)
    return a2

a1 = BitVec('a1',64)
s = Solver()

s.add(ru(a1) == 0xFD94E6E84A0A)    
print(s.check())
print(s.model())

z3로 주어야 하는 인자 값을 알아냈다.

[a1 = 18067113757832936006]

16진수로는 0xfabb483d34347a46 이다.

 

 

 

 

 

 

unk_201020 = '91 41 60 F9 05 04 1B 7E 3C D0 3C 51 27 45 FF 09 C5 75 7D D2 62 77 DE 27 79 7C DD 1D 6C A4 D3 12 26 F3 33 8C 76 E3 67 06 B4 9C 40 06 BD 9B F7 77 49 20 AB 92 1A E3 5E 7E B1 68 1B EB 23 A4 40 44 59 B0 FB EA A2 B1 E7 BF 7E B0 64 B2 A9 7C D7 96 E6 45'
unk_201020 = [int(i,16) for i in unk_201020.split(' ')]
unk_201020.extend([0] * (100-len(unk_201020)) )

a2 = 0xfabb483d34347a46
for i in range(100):
    a2 = (0x5DEECE66D * a2 + 11)
    unk_201020[i] ^= a2 & 0xff


with open('function_opcodes','wb') as f:
    f.write(bytearray(unk_201020))

이 코드로 파일을 만들 수 있다.

 

 

 

 

 

 

c를 눌러서 코드로 만들어준다.

 

 

 

 

 

 

syscall로 출력하는 것 이다.

 

 

 

 

 

push    7D307470h
push    7972635Fh
push    76756C5Fh
push    7961735Fh
push    495F6E34h
push    635F7434h
push    68777B46h
push    54434455h

문자열을 push하는 것을 볼 수 있다.

 

 

 

 

 

ls = [
    0x7D307470,
    0x7972635F,
    0x76756C5F,
    0x7961735F,
    0x495F6E34,
    0x635F7434,
    0x68777B46,
    0x54434455
]
ls = ls[::-1]

flag = ''
for i in ls:
    hex_i = hex(i)[2:]
    st = ''
    for j in range(0,len(hex_i)-1,2):
        int_16 = int(hex_i[j:j+2],16)
        st += chr(int_16)
    flag += st[::-1]

print(flag)

 

 

 

 

 

 

 

 

 

플래그 : UDCTF{wh4t_c4n_I_say_luv_crypt0}

'write up > BlueHens CTF 2021' 카테고리의 다른 글

BlueHens CTF 2021 - MineR Code  (0) 2021.03.22
Comments