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
- 라이트 업
- c언어
- 파이썬
- probgame
- 시탭
- 뭉뭉
- 라이트업
- write-up
- vsCode
- 드림핵
- ctf
- 풀이
- ShaktiCTF
- 해킹캠프
- 2021
- 리버싱
- PYTHON
- reversing.kr
- 워 게임
- 히공
- hackingcamp
- 코드엔진
- 강의
- 변수
- reversing
- 라업
- web
- Basic
- 리버스 엔지니어링
- write up
Archives
히공
ShaktiCTF 2021 - deceev 본문
728x90
문제
int __cdecl main(int argc, const char **argv, const char **envp)
{
FILE *v3; // eax
unsigned int v4; // eax
int result; // eax
char *argv_1; // [esp+4h] [ebp-14h]
char *Str; // [esp+8h] [ebp-10h]
_BYTE *Block; // [esp+Ch] [ebp-Ch]
int Size; // [esp+10h] [ebp-8h]
char *base64_encode_str; // [esp+14h] [ebp-4h]
maybe_printf(aEnterTheString);
v3 = __acrt_iob_func(0);
maybe_read((int)Str, 256, v3);
v4 = strlen(Str);
base64_encode_str = bas64_encode((int)Str, v4);
maybe_printf(aEncodedS);
Size = sub_4011E0(base64_encode_str) + 1;
Block = malloc(Size);
if ( sub_4012D0(base64_encode_str, (int)Block, Size) )
{
if ( argc == 2 )
{
argv_1 = (char *)argv[1];
malloc(0x100u);
sub_401510(argv_1);
}
Block[Size] = 0;
sub_404792(Block);
maybe_printf(aGoodDay);
result = 0;
}
else
{
maybe_printf(aDecodeFailure);
result = 1;
}
return result;
}
메인 함수
이 함수가 궁금했다.
int __cdecl sub_401510(char *argv_1)
{
void *v1; // eax
unsigned int v2; // eax
const char *v3; // eax
int result; // eax
v1 = malloc(0x100u);
sub_401490(argv_1, 0, (int)v1);
v2 = strlen(Str2);
v3 = bas64_encode((int)Str2, v2);
result = strcmp(v3, Str2);
if ( !result )
result = maybe_printf(aYupYouGotMePYo);
return result;
}
Str2를 살펴보니
x2JlwWFmz2w0vWpgY210M2Y1vaVpYqN1Y2xaZ3B5wC0cyTAayqVuNTFrNXVuZaNmwmpaLXJgvTN3NWt1M2JbwTNmuWx=
였다.
sub_401490이 좀 신기한 친구였다.
int __cdecl sub_401490(char *Str, int i, int a3)
{
if ( i < strlen(Str) )
{
*(_BYTE *)(a3 + 2 * i) = Str[i];
*(_BYTE *)(a3 + 2 * i + 1) = aBuggyM355[i % strlen(aBuggyM355)];
a3 = sub_401490(Str, i + 1, a3);
}
return a3;
}
문자열 사이사이에 "buggy-m355"의 각 요소를 하나하나 가져와서 넣는 것을 알 수 있다.
재귀함수로 반복한다.
_BYTE *__cdecl sub_401060(int a1, unsigned int a2)
{
unsigned int v3; // [esp+0h] [ebp-1Ch]
int v4; // [esp+4h] [ebp-18h]
unsigned int v5; // [esp+8h] [ebp-14h]
_BYTE *v6; // [esp+Ch] [ebp-10h]
int v7; // [esp+10h] [ebp-Ch]
int v8; // [esp+14h] [ebp-8h]
unsigned int v9; // [esp+18h] [ebp-4h]
if ( !a1 || !a2 )
return 0;
v5 = sub_401000(a2);
v6 = malloc(v5 + 1);
v6[v5] = 0;
v9 = 0;
v7 = 0;
while ( v9 < a2 )
{
v8 = *(unsigned __int8 *)(v9 + a1);
if ( v9 + 1 >= a2 )
v4 = v8 << 8;
else
v4 = *(unsigned __int8 *)(v9 + a1 + 1) | (v8 << 8);
if ( v9 + 2 >= a2 )
v3 = v4 << 8;
else
v3 = *(unsigned __int8 *)(v9 + a1 + 2) | (v4 << 8);
v6[v7] = byte_413160[(v3 >> 18) & 0x3F];
v6[v7 + 1] = byte_413160[(v3 >> 12) & 0x3F];
if ( v9 + 1 >= a2 )
v6[v7 + 2] = '=';
else
v6[v7 + 2] = byte_413160[(v3 >> 6) & 0x3F];
if ( v9 + 2 >= a2 )
v6[v7 + 3] = '=';
else
v6[v7 + 3] = byte_413160[v3 & 0x3F];
v9 += 3;
v7 += 4;
}
return v6;
}
base64다.
byte_413160이 table일 것 같았다.
.rdata:00413160 byte_413160 db 'A' ; DATA XREF: bas64_encode+EE↑r
.rdata:00413160 ; bas64_encode+105↑r ...
.rdata:00413161 aBcdefghijklmno db 'BCDEFGHIJKLMNOPQRSTUVWXYZzyxwvutsrqponmlkjihgfedcba0123456789+/',0
테이블이 일반적인 base64 테이블와 다른 것을 알 수 있었다.
import base64
my_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZzyxwvutsrqponmlkjihgfedcba0123456789+/"
std_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
s = 'x2JlwWFmz2w0vWpgY210M2Y1vaVpYqN1Y2xaZ3B5wC0cyTAayqVuNTFrNXVuZaNmwmpaLXJgvTN3NWt1M2JbwTNmuWx='
c = s.translate(str.maketrans(my_base64chars, std_base64chars))
data = base64.b64decode(c).decode()
print(data)
sbhuagkgtyi-cmt3f5{5db3ucg3gpyt-1m03n5_51b5u_g3gvy3-rmy3w5h53bru3g}g
이런 문자가 출력되었다.
뭔가 이상했는데 아까 sub_401490함수에서 사이사이에 문자를 집어넣은 것이 생각났다.
import base64
my_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZzyxwvutsrqponmlkjihgfedcba0123456789+/"
std_base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
s = 'x2JlwWFmz2w0vWpgY210M2Y1vaVpYqN1Y2xaZ3B5wC0cyTAayqVuNTFrNXVuZaNmwmpaLXJgvTN3NWt1M2JbwTNmuWx='
c = s.translate(str.maketrans(my_base64chars, std_base64chars))
data = base64.b64decode(c).decode()
# 사이사이에 buggy-m355 없애주기
flag = ''
for i in range(0,len(data)-1,2):
flag+=data[i]
print(flag)
플래그 : shaktictf{d3c3pt10n_15_3v3rywh3r3}
퍼블
플래그 : shaktictf{d3c3pt10n_15_3v3rywh3r3}
'write up > ShaktiCTF 2021' 카테고리의 다른 글
ShaktiCTF 2021 - Chunkies (0) | 2021.04.05 |
---|---|
ShaktiCTF 2021 - PacMat (0) | 2021.04.05 |
ShaktiCTF 2021 - BomB (0) | 2021.04.05 |
ShaktiCTF 2021 - fusk (0) | 2021.04.05 |
ShaktiCTF 2021 - hack (0) | 2021.04.05 |
Comments