촉촉한초코칩
[Dreamhack] Easy Assembly 본문
권한을 주고 실행하니 이런 메시지가 나왔다.
실행파일로 만들어야된다.
cat 명령어로 보니 안에 이런 문자들이 있었다.
안에도 Usage : <key> 이 부분이 있어서 다음 문자열을 ./prob 실행할 때 같이 넣어줬다.
아닌것 같다..
풀이 찾아보니까 main이 아니라 _start 함수를 통해 시작하는 것 같은데.. 어떻게 찾지 하다가 gcc 명령어로 찾음
그리고 해당 에러는 링커 에러라고 한다.
일단 함수 하나는 알아냈으니까 gdb로 분석해보았다.
여기서 key 값을 확인하는 것 같다.
edx끼리 xor 연산하고 esi의 값을 dl에 넣는다.
0x804a10c와 dl을 xor연산하고
edi의 값과 dl을 xor 연산한다.
ecx와 edx는 or 연산하고
esi, edi 증가하고 eax는 1 감소시킨다.
그리고 0x804906b와 비교했을 때 값이 같지 않으면 다시 함수를 실행한다.
0x804906b는 xor edx, edx를 말한다.
check_password와 xor edx, edx 값이 같아야 통과되는 것 같다.
check_password에 break point를 걸고 edx의 값이 뭔지 확인해본다.
한바퀴 돌고 나면 각 레지스터에는 이런 값이 들어가게 된다.
enc_flag의 값이 수상해 보여서 해당 주소에 있는 값이 뭔지 봤다.
실패..
섹션의 데이터부분을 봤는데 이 문자열들이 나왔다.
You nailed 이전 부분들은 HxD에서 나오는게 더 보기 편하다.
https://dreamhack.io/wargame/writeups/14836 참고..
#include <iostream>
int check_password(int len, int isOk, int *enc_flag, int *key) {
do {
isOk = isOk | (*enc_flag++ ^ 49 ^ *key++);
--len;
} while (len);
return isOk;
}
int main() {
int enc_flag[] = {116, 120, 75, 101, 119, 72, 92, 105, 104, 126, 92, 121, 119, 98, 70, 121, 119, 5, 70, 84, 115, 114, 89, 105, 104,
126, 92, 126, 90, 97, 87, 106, 119, 102, 90, 82, 2, 98, 92, 121, 119, 92, 0, 124, 87, 13, 13, 77, 0};
int key[49];
int len = 49;
for (int i = 0; i < len; i++) {
for (int k = 0; k < 256; k++) {
if ((enc_flag[i] ^ len ^ k) == 1) {
key[i] = k;
break;
}
}
}
if (check_password(len, 0, enc_flag, key) == 1) {
printf("Key found!\n");
for (int i = 0; i < len; i++) {
printf("%c", key[i]);
}
printf("\n");
} else {
printf("Key not found.\n");
}
return 0;
}
enc_flag는 16진수를 10진수로 변환한 값이다.
check_password함수는 아래 코드를 그대로 C++로 바꾼 것 같고.. 너무 어렵다..
IDA에서 열려고 했는데 안돼서 왜지.. 싶었는데 All files로 해야 되는 거였음..
'Study > Reversing' 카테고리의 다른 글
[Dreamhack] rev-basic-4 (0) | 2024.07.27 |
---|---|
[Dreamhack] rev-basic-2 (1) | 2024.07.22 |
CodeEngn Basic RCE L16 (0) | 2022.11.25 |
CodeEngn Basic RCE L15 (0) | 2022.11.22 |
CodeEngn Basic RCE L14 (0) | 2022.11.17 |