re 학습 노트 (30) HGAME 2020 - re - Level - Week 1 - bitwiseoperation2
39661 단어 ctf 소 백 성장#reverse
개인 블 로그: 제목 링크 진입 클릭: HGAME 2020 - re - Level - Week 1 - bitwiseoperation 2 제목 다운로드: 클릭 하여 다운로드
제목 설명
세 번 째 C 언어 교육 의 숙제 인 '비트 연산' 을 기억 하 십 니까?이것 은 2.0 학습 자료 입 니 다.http://q42u2raim.bkt.clouddn.com/bitwise-hint1-xor.png 제목 주소http://q42u2raim.bkt.clouddn.com/bitwise_operation2_9d9dc26c1359ec66
해제
분석 문제
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
signed int i; // [rsp+4h] [rbp-6Ch]
signed int j; // [rsp+8h] [rbp-68h]
signed int k; // [rsp+Ch] [rbp-64h]
char v6[8]; // [rsp+10h] [rbp-60h]
__int64 data_1; // [rsp+20h] [rbp-50h]
char v8; // [rsp+28h] [rbp-48h]
__int64 data_2; // [rsp+30h] [rbp-40h]
char v10; // [rsp+38h] [rbp-38h]
char user_input[40]; // [rsp+40h] [rbp-30h]
unsigned __int64 v12; // [rsp+68h] [rbp-8h]
v12 = __readfsqword(0x28u);
sub_4007E6();
v6[0] = 76;
v6[1] = 60;
v6[2] = -42;
v6[3] = 54;
v6[4] = 80;
v6[5] = -120;
v6[6] = 32;
v6[7] = -52;
__isoc99_scanf("%39s", user_input);
if ( strlen(user_input) == 39
&& user_input[0] == 'h'
&& user_input[1] == 'g'
&& user_input[2] == 'a'
&& user_input[3] == 'm'
&& user_input[4] == 'e'
&& user_input[5] == '{'
&& user_input[38] == '}' )
{
data_1 = 0LL;
v8 = 0;
data_2 = 0LL;
v10 = 0;
sub_400616(&data_1, &user_input[6]); // 6~21
sub_400616(&data_2, &user_input[22]); // 22~38
for ( i = 0; i <= 7; ++i ) //
{
*(&data_1 + i) = ((*(&data_1 + i) & 224) >> 5) | 8 * *(&data_1 + i);
*(&data_1 + i) = *(&data_1 + i) & 0x55 ^ ((*(&data_2 + 7 - i) & 0xAA) >> 1) | *(&data_1 + i) & 0xAA;
*(&data_2 + 7 - i) = 2 * (*(&data_1 + i) & 0x55) ^ *(&data_2 + 7 - i) & 0xAA | *(&data_2 + 7 - i) & 0x55;
*(&data_1 + i) = *(&data_1 + i) & 0x55 ^ ((*(&data_2 + 7 - i) & 0xAA) >> 1) | *(&data_1 + i) & 0xAA;
}
for ( j = 0; j <= 7; ++j )
{
*(&data_1 + j) ^= v6[j]; //
if ( *(&data_1 + j) != byte_602050[j] ) //
{
puts("sry, wrong flag");
exit(0);
}
}
for ( k = 0; k <= 7; ++k )
{
*(&data_2 + k) ^= *(&data_1 + k) ^ v6[k]; //
if ( *(&data_2 + k) != byte_602060[k] ) //
{
puts("Just one last step");
exit(0);
}
}
puts("Congratulations! You are already familiar with bitwise operation.");
puts("Flag is your input.");
exit(0);
}
puts("Illegal input!");
exit(0);
}
대체 절 차 는 사용자 가 39 자 를 입력 하 는 것 이다.그리고 길 이 를 확인 하 십시오. 앞의 여섯 글자 가 "hgame {" 인지, 마지막 문자 가 "}" 인지, 그리고 sub 인지 확인 하 십시오.400616 은 매번 16 개의 문 자 를 8 개의 문자 로 암호 화 합 니 다.그리고 한 무더기 의 비트 연산 을 한 후에 두 개의 이 또는 그 다음 에 비교 하 였 다.
exp
#include
int main()
{
int i;
char flag[40] = { 'h','g','a','m','e','{' ,0,0 };
flag[38] = '}';
unsigned char data0[] = { 76,60,-42,54,80,-120,32,-52 };
int j, k;
char data1[9] = "e4sy_Re_";
char data2[9] = "Easylif3";
unsigned char data_1[9] = { 0 }, data_2[9] = {0};
unsigned char input1[9] = { 0 }, input2[9] = {0};
for (i = 0; i < 8; i++)
data_2[i] = data2[i] ^ data0[i] ^ data1[i];
for (i = 0; i < 8; i++)
data_1[i] = data1[i] ^ data0[i];
for (i = 0; i < 8; i++)//
{
for (j = 0; j < 256; j++)
{
for (k = 0; k < 256; k++)
{
int a1 = j, a2 = k;
a1 = ((a1 & 0xE0) >> 5) | 8 * a1;
a1 = a1 & 0x55 ^ ((a2 & 0xAA) >> 1) | a1 & 0xAA;
a2 = 2 * (a1 & 0x55) ^ a2 & 0xAA | a2 & 0x55;
a1 = a1 & 0x55 ^ ((a2 & 0xAA) >> 1) | a1 & 0xAA;
if (a1 == data_1[i] && a2 == data_2[7 - i])
{
input1[i] = j;
input2[7 - i] = k;
}
}
}
}
for (i = 0; i < 8; i++)//
{
for (j = 0; j < 16; j++)
{
for (k = 0; k < 16; k++)
{
if (input1[i] == 16 * j + k)
{
if (j > 9)
flag[6 + 2 * i] = j + 87;
else
flag[6 + 2 * i] = j + 48;
if (k > 9)
flag[7 + 2 * i] = k + 87;
else
flag[7 + 2 * i] = k + 48;
}
if (input2[i] == 16 * j + k)
{
if (j > 9)
flag[22 + 2 * i] = j + 87;
else
flag[22 + 2 * i] = j + 48;
if (k > 9)
flag[23 + 2 * i] = k + 87;
else
flag[23 + 2 * i] = k + 48;
}
}
}
}
puts(flag);
return 0;
}
실행 되 는 flag
hgame{0f233e63637982d266cbf41ecb1b0102}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Git에서 개발 환경을 정리해 보았습니다.로컬에 작업 디렉토리 만들기 mkdir [ワーキングディレクトリ名] 작업 디렉토리로 이동 cd [ワーキングディレクトリ名] 작업 디렉토리 초기화 git init git로 연결할 원격 리포지토리를 만듭니다. 이 때 REA...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.