제목 : 7 번째 'Huxiang Cup'사이버 보안 경쟁 - 예비 게임 쓰기

Web​

easywill​

문제 해결책
湖湘杯-WriteUp

가변 오버레이
심리 블로그의 최근 기사는 PearCMD를 활용합니다 : https://tttang.com/archive/1312/
湖湘杯-WriteUp
湖湘杯-WriteUp
湖湘杯-WriteUp

Pentest in Autumn​

문제 해결을위한 아이디어
http://eci-2ze40jm526y24nv2lkl3.cloudeci1.icunqiu.com:8888/허가 바이 패스/;/actuator/env/;/actuator/heapdump
湖湘杯-WriteUp
암호 해독 스크립트
importbase64
importStruct
print (base64.b64encode (struct.pack
#gr0yuckgpcxbtzjzzz1wsozw==
湖湘杯-WriteUp
Flag {3FA31850-8EE6-40F2-9B18-9ECF6CAC176C}

Reverse​

Hideit​

문제 해결책
열린 후 SMC가 있음을 발견했으며 단일 단계 디버깅에서 기본 기능을 찾을 수 없습니다.
출력 문자열 인 Puts 아래의 브레이크 포인트를 발견하고 두 번째 휴식 후 주 기능으로 돌아가 기능 헤더로 이동하여 디 컴파일합니다.
__int64____scallsub_24d61161bb0 (__ int64a1)
{
//.
if (! (unsignedint) off_24d61163000 (-2147483646i64, Asoftwareclasse, v24))
{
v23=0;
((void (__ fastcall*) (char*, _ qword, __ int64)) unk_24d61162a0c) (v21,0i64,520i64);
v22=66;
if (! (unsignedint) off_24d61163008 (v24, akeyssecret, 0i64, v23, v21, v22)).
OFF_24D61163020 (0i64,0i64, v21,0xfffffffi64, v14,260,0i64,0i64);
}
OFF_24D611630F8 (afirstSecrether);
v10=0i64;
v11=0;
((void (__ fastcall*) (void*, __ int64*)) UNK_24D61161B50) (UNK_24D6116324C, v10);
v12=0i64;
strcpy ((char*) v12, (constchar*) v10);
v13 [0]=114;
v13 [1]=514;
v13 [2]=19;
v13 [3]=19;
((void (__ fastcall*) (char*, _ qword, __ int64)) unk_24d61162a0c) (v20,0i64,512i64);
v3=hidword (v12);
v4=32;
v5=v12;
v6=hidword (v12);
v7=0;
하다
{
V7-=1640531527;
v8=(v72) 3;
v5+=((v7^v3)+(v6^v13 [v8]))^(((16*v6)^(v33))+((v65)^(4*v3));
v3+=((v7^v5)+(v5^v13 [v8^1]))^(((16*v5)^(v53)))+((v55)^(4*v5));
v6=v3;
--v4;
}
(v4);
if (v5==288407067v3==1668576323)
{
v17=0i64;
v18=(unsigned__int8) v10 | ((byte1 (v10) | (Word1 (v10) 8)) 8);
v19=byte4 (v10) | ((byte5 (v10) | (hiword (v10) 8)) 8);
((void (__ fastcall*) (_ dword*, __ int64)) unk_24d61161000) (v16, a1); //키 확장
sub_24d61161150 (v16, v14, v20); //두 번째 단계 암호화
while (byte_24d611631d0 [v2]==v20 [v2])
{
if (++ v2=32)
returnoff_24d611630f8 (ayoufindlastsec);
}
}
return0i64;
} 먼저 클래스 차 암호화를 수행합니다. 이 8 단어가 방법을 준수하면 암호화의 두 번째 단계를 수행하십시오. 클래스 차 암호화는 문자열 dotitsit을 디코딩하고 두 번째 단락은 다음과 같이 암호화됩니다.
_DWORD*__ FASTCALLSUB_24D61161150 (_DWORD*A1, __ Int128*A2, _BYTE*A3)
{
//.
if (a2)
{
v13=(char*) a2- (char*) v122;
v14=v122;
하다
{
*(_ byte*) v14=*((_ byte*) v14+v13);
v14=(__ int128*) ((char*) v14+1);
--v11;
}
(v11);
V127=V122;
}
//키 오퍼레이션
동안 (1)
{
//키 오퍼레이션
}
//.
if (v127)
{
//여기에서 중단 점을 준비하고 v76의 값을보십시오 . 원래 데이터를 xor
v76^=*(unsigned__int8*) v127 | ((*((unsigned__int8*) v127+1) |*((unsigned__int16*) v127+1) 8)) 8);
v77^=*((unsigned__int8*) v127+4) | (*(*((unsigned__int8*) v127+5) v127+5) | (*(unsigned__int16*) v127+3) 8));
v78^=*((unsigned__int8*) v127+8) | ((*((unsigned__int8*) v127+9) v127+9) | (*((unsigned__int16*) v127+5) 8));
v79^=*((unsigned__int8*) v127+12) | ((*((unsigned__int8*) v127+13) v127+13) | (*((unsigned__int16*) v127+7) 8)) 8);
v80^=*((unsigned__int8*) v127+16) | ((*((unsigned__int8*) v127+17) v127+17) | (*((unsigned__int16*) v127+9) 8)) 8);
v129^=*((unsigned__int8*) v127+20) | (*(*((unsigned__int8*) v127+21) v127+21) | (*((unsigned__int16*) v127+11) 8)) 8);
lodword (v97)=(*((unsigned__int8*) v127+24) | ((*((unsigned__int8*) v127+25) v127+25) | (*(unsigned__int16*) v127
+13) 8)) 8))^V97;
hidword (v97)^=*((unsigned__int8*) v127+28) | (*(*(unsigned__int8*) v127+29) | (*(unsigned__int16*) v127
+15) 8)) 8);
v81^=*((unsigned__int8*) v127+32) | (*(*((unsigned__int8*) v127+33) v127+33) | (*(unsigned__int16*) v127+17) 8);
v86^=*(((unsigned__int8*) v127+36) | (*(*((unsigned__int8*) v127+37) v127+37) | (*(unsigned__int16*) v127+19) 8));
v87^=*((unsigned__int8*) v127+44) | (*(*((unsigned__int8*) v127+45) v127+45) | (*((unsigned__int16*) v127+23) 8)) 8);
v82^=*((unsigned__int8*) v127+48) | (*(*((unsigned__int8*) v127+49) v127+49) | (*(unsigned__int16*) v127+25) 8);
V83^=*((unsigned__int8*) v127+52) | (*(*((unsigned__int8*) v127+53) v127+53) | (*((unsigned__int16*) v127+27) 8)) 8);
v84^=*((unsigned__int8*) v127+56) | (*(*((unsigned__int8*) v127+57) v127+57) | (*(unsigned__int16*) v127+29) 8);
v85^=*(((unsigned__int8*) v127+60) | ((*((unsigned__int8*) v127+61) |
v75^=*((unsigned__int8*) v127+40) | (*(*((unsigned__int8*) v127+41) v127+41) |
}
//데이터 코피
하다
{
*v90=v90 [(char*) v122-a3];
++ v90;
--v91;
}
(v91);
결과=a1;
A1 [12]=V105;
A1 [13]=V100;
ReturnResult;
}이 함수는 복잡해 보이지만 실제로 키에서 매우 복잡한 작업을 수행하고 입력으로 XOR을 수행하는 것이므로 깃발을 얻으려면 키 만 덤프하면됩니다.
exp
#IncludestDio.h#IncludEstdlib.h
#includeinttypes.h
#Includestring.h
#include'defs.h '
#IncludestDint.h
voidDecrypt (uint32_t*v)
{
UINT32_TV7, V8, V6, V5, V4, V3;
v4=32;
UINT32_TV11 []={114,514,19,19};
v7=0x9e3779b9*32;
v5=0x1130be1b;
v3=0x63747443;
{
v8=(v72) 3;
v3-=((v7^v5)+(v5^v11 [v8^1]))^((16*v5)^(v53))+((v55)^(4*v5));
v6=v3;
v5-=((v7^v3)+(v6^v11 [v8]))^(((16*v6)^(v33))+((v65)^(4*v3));
--v4;
v7-=0x9e3779b9;
} while (v4);
v [0]=v5;
v [1]=v3;
}
intmain ()
{
UINT32_TK []={114,514,19,19};
uint8_tp []='12345678';
UINT32_TC []={288407067,1668576323};
해독 (c);
printf ( '%sn', c);
for (size_ti=0; i8; i ++)
{
printf ( '0x%02x,*(uint8_t*) c );
}
printf ( 'n');
charkey []='expand32-bytek0n3@ayi_m3l0dy_kurom1_w_suk1dqy0x01x00x00x00x00x00x00x00x00x00x00x00x00x00dotititit';
uint8_tdata []={0xeb,0x8e,0x5c,0xa5,0x62,0xb4,0x1c,0x84,0x5c,0x59,0xfc,0xd,0x43,0x3c,0x AB,0x20,0xD8,0X93,0x33,0x13,0xa1,0x9e,0x39,0x0,0x76,0x14,0x4,0x58,0x9d,0x6,0xb8};
uint8_tres [128]={0};
UINT32_TK0=0XC23DE28D;
uint32_t*d=(uint32_t*) 데이터;
d [0]^=k0;
d [1]^=0xca2df219;
d [2]^=0x52CF1418;
d [3]^=0x139c5a77;
d [4]^=0x5b04ccaa;
d [5]^=0x680cc192;
d [6]^=0x47f95845;
d [7]^=0xc535d968;
printf ( '%sn', d);
}

shell​

문제 해결 아이디어
아동 프로세스는 기본적으로 생성되며 부모-자녀 과정이 해체됩니다. 아동 프로세스를 덤프하는 프로그램을 찾으십시오. https://github.com/glmcdona/process-dump
PD-PID 아동 프로세스 PID 아동 프로세스 PID를 디버깅하여 IDA 오픈 덤프 후에 아동 프로세스를 얻을 수 있습니다.
.Text:0001fa6c311160pushrsi
.Text:000001fa6c311161pushrdi
.Text:000001fa6c311162subrsp, 28h
.Text3:000001fa6c3111666learcx, 형식; 'plzinputyourflagn'
.Text:000001fa6c31116dcallsub_1fa6c3112b0
.Text:000001fa6c311172learcx, a42s; '%42s'
.Text3:000001fa6c311179learsi, 알려진_string; 이것은0x40A0입니다
.Text:000001FA6C311180MOVRDX, RSI
.Text3:000001fa6c311183callscanf
.Text:000001fa6c311188int3; traptodebugger
.Text:000001fa6c311189; ----------------------------------------------------------------------------------------------------
.Text:000001fa6c311189movrcx, rsi; str
.Text:000001fa6c31118ccallstrlen
.Text:000001fa6c311191cmmprax, 0c9h
.Text3:000001fa6c311197jbshortnearptrunk_1fa6c31119e
.Text3:000001fa6c311199callsub_1fa6c311020
.Text:0001FA6C311199; --------------------------------------------------------------------------------------------
.Text3:000001fa6c31119eunk_1fa6c31119edb0c4h; CodexRef:main+37 ↑ J.
.Text:000001fa6c31119fdb12h 주 프로세스의 디버깅 기능과 결합되었습니다
int__fastcallsub_7ff6c56b1560 (_dword*a1)
{
//.
if (*a1==0x80000003)
{
v5=qword_7ff6c56b5630;
if (qword_7ff6c56b5630)
{
context.contextflags=1048587;
if (! getthreadcontext (hthread, context))
{
v6=getLasterror ();
printf ( 'getThreadContextFailed:%llxn', v6);
}
readProcessMemory (hprocess, (lpcVoid) (qword_7ff6c56b5638+0x40a0), v13,0x2aui64, numbumbbytesread);
v7=_mm_load_si128 ((const__m128i*) xmmword_7ff6c56b3420
 
뒤로
상단