Kernel Introduction 문제입니다.
문제에 접속하면 바이너리 파일을 다운로드 받을 수 있습니다.
바이너리 파일을 다운로드 받아보면 실행파일도 뭐도 아닌걸 알 수 있는데..
사실 실행하면 풀리는 문제인거 같습니다..(필자는 그렇게 풀지 않았습니다..)
어쨌든 필자는 아이다로 열어서 살펴봤습니다. 문자열이 박혀있고, 어떤 루틴을 통과합니다.
그리고 그 루틴을 모두 통과한 뒤에 연산 결과를 출력해주는 식의 프로그램이더군요.
보기 쉽게 헥스레이로 보면 이런식으로 코드가 표시됩니다.
그럼 이 코드를 비슷하게 코딩해서 출력해주면 플래그가 뜨겠군! 이라고 생각할 수 있습니다.
문제는 qmemcpy(buffer, &unk_236, sizeof(buffer)); 이 부분이겠네요.
버퍼에 무언가 메모리를 복사해 오는데 저 &unk_236 의 값을 알지 못하면 연산하는 값을 설정해 줄 수 없어서
이상한 값이 출력되니까요.
그래서 &unk_236 부분을 찾아가줍니다.
정확히 buffer의 크기만큼 헥스값 34개가 박혀있습니다. 이걸 그대로 갖다쓰면 되겠네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <stdio.h> #include <string.h> int main(void){ char key[1024] = "28714143kkl23jlsdkj34hji53jhk345khj543jhk354h354jh354jhkl354jhkl354hjk345hjk3h4i5h3l4h5iul34u6h4e5uh7ui5h7uilyhhiuyhuileyhlui6yhuilyuhil55hhuilhiw543uhiw34uhihuiuh6iwl354h"; char buffer[34] = {0x76, 0x34,0x71,0x76,0x4f,0x4c,0x7b,0x42,0x0e,0x5e,0x06,0x4e,0x02,0x72,0x50,0x01,0x53,0x07,0x0c,0x34,0x06,0x4b,0x07,0x04,0x2a,0x61,0x0a,0x66,0x73,0x53,0x03,0x4e,0x04,0x00}; int v5 = atoi(key); int v0 = 0, v6 = 0, v1 = 0, v3 = 0,i,j; char v7; char output[1024]; v1 = key; for(i =256; i; --i){ v1 = 0; v1 += 4;} v3 = output; for(j = 256; j; --j){ v3 = 0; v3 += 4; } sprintf(key, "0x%08x", v5); while(v0 < strlen(buffer)){ v7 = key[v6++]; sprintf(output,"%s%c",output, v7^buffer[v0]); if(v6 == strlen(key)){v6 = 0;} ++v0; } printf("<1>%s\n",output); return 0; } | cs |
그래서 위에서 알아낸 정보들을 가지고 간단히 코딩을 수행했습니다.
이 코드를 실행해주게 되면
이렇게 플래그가 나오게됩니다.
커널 단에서 실행하는 것을 목표로하는 문제같은데
얼떨결에 코드 복사,해석으로 풀어버렸네요.. 나중에 시간날 때
커널 단에서 실행하는 식으로 다시 풀어봐야겠습니다..
반응형
'Wargame > Reversing-W' 카테고리의 다른 글
xcz.kr PROB9 (0) | 2017.08.07 |
---|---|
wargame.kr DLL_with_notepad (0) | 2017.08.04 |
xcz.kr PROB30 (0) | 2017.08.04 |
wargame.kr keypad_crackme (0) | 2017.08.02 |
wargame.kr easy_crackme (0) | 2017.08.01 |