문제 설명
문제 정보
- 문제 이름 : secret message
- 문제 유형 :
문제 풀이
문제 분석
main 함수
undefined8 main(void)
{
long lVar1;
int iVar2;
size_t sVar3;
undefined8 correct;
long in_FS_OFFSET;
char input [264];
lVar1 = *(long *)(in_FS_OFFSET + 0x28);
__isoc99_scanf("%63s",input);
sVar3 = GetStrLen(input);
if (sVar3 == 0x20) {
XORWithParam2(input,&data_1);
IncWithParam2(input,31);
DecWithParam2(input,90);
XORWithParam2(input,&data_2);
DecWithParam2(input,77);
IncWithParam2(input,-13);
XORWithParam2(input,&data_3);
iVar2 = memcmp(input,answer,0x20);
if (iVar2 == 0) {
puts("Correct!");
correct = 0;
}
else {
puts("your input is wrong x(");
correct = 1;
}
}
else {
puts("your input length is wrong x(");
correct = 1;
}
if (lVar1 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return correct;
}
FUN_004011ef
void XORWithParam2(char *input, char *param_2) {
size_t sVar1;
int local_14;
sVar1 = GetStrLen(param_2);
for (local_14 = 0; local_14 < 0x20; local_14 = local_14 + 1) {
input[local_14] = param_2[(ulong)(long)local_14 % sVar1] ^ input[local_14];
}
return;
}
두 매개변수 배열에 xor를 연산을 진행함.
FUN_00401263
void IncWithParam2(char *input, char num) {
int local_c;
for (local_c = 0; local_c < 0x20; local_c = local_c + 1) {
input[local_c] = num + input[local_c];
}
return;
}해당 코드를 분석해 보면 input 이라는 문자열에 모든 문자값에 num이라는 값을 덧하는 코드입니다.
FUN_004012b0
void DecWithParam2(char *input, char num) {
int i;
for (i = 0; i < 0x20; i = i + 1) {
input[i] = input[i] - num;
}
return;
}해당 코드를 분석해 보면 input 이라는 문자열에 모든 문자값에 num이라는 값을 뺴는 코드입니다.
역산 코드
encrypt_data = [0xf8, 0xe0, 0xe6, 0x9e, 0x7f, 0x32, 0x68, 0x31, 0x05, 0xdc,
0xa1, 0xaa, 0xaa, 0x09, 0xb3, 0xd8, 0x41, 0xf0, 0x36, 0x8c,
0xce, 0xc7, 0xac, 0x66, 0x91, 0x4c, 0x32, 0xff, 0x05, 0xe0,
0xd9, 0x91]
data1 = [0xde, 0xad, 0xbe, 0xef]
data2 = [0xef, 0xbe, 0xad, 0xde]
data3 = [0x11, 0x33, 0x55, 0x77, 0x99, 0xbb, 0xdd]
def XOR_FUNC_REV(output_data, num):
for i, value in enumerate(output_data):
output_data[i] ^= num[i % len(num)]
def ADD_FUNC_REV(output_data, num):
for i, value in enumerate(output_data):
output_data[i] -= num
def SUB_FUNC_REV(output_data, num):
for i, value in enumerate(output_data):
output_data[i] += num
if __name__ == "__main__":
XOR_FUNC(encrypt_data, data3)
ADD_FUNC(encrypt_data, -13)
SUB_FUNC(encrypt_data, 77)
XOR_FUNC(encrypt_data, data2)
SUB_FUNC(encrypt_data, 90)
ADD_FUNC(encrypt_data, 31)
XOR_FUNC(encrypt_data, data1)
for i in encrypt_data:
print(chr(i % 128), end='')트러블 슈팅
1. chr 유니 코드 출력 문제
33번째 줄에서 chr()를 이용해서 i 값을 문자로 변환해 준다. 이때 chr() 함수는 숫자를 유니코드로 변환해 주기때문에 128을 넘길 경우 이상한 값이 출력됩니다.
따라서 다음과 같은 코드로 실행될 경우 아래와 같이 이상한 문자가 출력됩니다.
print(chr(i), end='')