Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 풀이
- 라업
- 드림핵
- write up
- reversing.kr
- write-up
- 라이트업
- 뭉뭉
- 시탭
- c언어
- vsCode
- 코드엔진
- Basic
- reversing
- probgame
- ShaktiCTF
- 리버싱
- 2021
- 강의
- 해킹캠프
- 리버스 엔지니어링
- hackingcamp
- 라이트 업
- ctf
- 워 게임
- web
- 파이썬
- 히공
- 변수
- PYTHON
Archives
히공
BlueHens CTF 2021 - Entropy 본문
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