풀이할 문제들의 공통점들이다

어셈블리를 c로 디컴파일한다
출력과 입력, 임력을 검증하는 함수들이 나온다

검증하는 함수를 알려준다

검증하는 함수에 사용되는 배열을 알려준다
검증하는 것을 성공시키면 correct가 출력되고 그 값을 플래그 형식에 맞춰서 제출하면 정답이 나온다

함수를 보니 친절히 하나하나 나와있다


배열을 보러 들어가보니 친절히 플래그가 나와 있었다
a1[i+1] + a1[i] != byte[i]
a1[i] != byte - a1[i+1]
a1[i+1] + a1[i] = byte[i]
byte[0] = a1[0] + a1[1]
byte[1] = a1[1] + a1[2]
byte[2] = a1[2] + a1[3]
byte[0] - byte[1] = a1[0] - a1[2]
byte[1] - byte[2] = a1[1] - a1[3]
byte[2] -
결론: 이렇게 하면 답이없다
추리를 진행하자
byte[23] = 0
a1[23] +a1[24] = 0
a1[22] + a1[23] = 76
a1[23]=0
a1[24]=0
a1[22] = 76
#include <stdio.h>
unsigned char byte[] =
{
0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1,
0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3,
0xA1, 0x98, 0x4C, 0x00
};
int main(){
int a=76;
int a1[24]={};
for(int i=21;i>=0;i--){
a1[i+1] = byte[i]- a;
a = byte[i]-a;
}
*(a1[24]) = a1[23];
for(int i=0;i<24;i++){
printf("%c",(char)a1[i]);
}
return 0;
}
이러면 L이 하나 출력되지 않는 현상이 일어나지만 그래도 플래그를 구할 수 있다
(unsigned __int8)(-5 * *(_BYTE *)(a1 + i)) != byte_140003000[i]
-5*a1[i] = byte[i]
unsigned char ida_chars[] =
{
0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25, 0x16, 0xC6,
0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5, 0xC6, 0x11, 0x07, 0xC5,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
8비트만 남아서 -5를 곱하면 8비트 부분만 남고 그 외의 것들은 다 날아간다
하나하나 아스키코드만 생각하고 무차별 대입 해준다면?
플래그를 구할 수 있었다
#include <stdbool.h>
#include <stdio.h>
char byte[] = {
0xac, 0xf3, 0x0c, 0x25, 0xa3, 0x10, 0xb7, 0x25,
0x16, 0xc6, 0xb7, 0xbc, 0x07, 0x25, 0x02, 0xd5,
0xc6, 0x11, 0x07, 0xc5, 0x00,
};
int main() {
char input[21] = {};
for (int i = 0; i < 21; ++i) {
for (int j = 0; j < 127; ++j) {
if ((char)(j * -5) == byte[i]) {
input[i] = j;
printf("%s\n", input);
break;
}
}
}
}

선택과제 수정해서 제출하겠습니다