Hackerschool/FTZ 부가설명

FTZ Level의 비밀번호를 알고 싶다면?

Kostrian 2015. 1. 29. 10:17

​간혹 FTZ비밀번호가 필요할때가 있습니다. 그럴때 블로그를 뒤질 필요 없이 직접 구축한 FTZ에서 비밀번호를 알아내는 방법을 알려드리겠습니다.

 

FTZ에는 자신의 비밀번호를 알아내기 위한 my-pass가 있습니다. 이 명령어는 /bin/에 위치하며 gdb로 분석하면 됩니다. 

 

 [root@BOF /root]# gdb -q /bin/my-pass 

(gdb) set dis intel

(gdb) disas main

Dump of assembler code for function main:

0x8048468 <main>: push   %ebp

0x8048469 <main+1>: mov    %ebp,%esp

0x804846b <main+3>: sub    %esp,8

0x804846e <main+6>: call   0x80483a8 <geteuid>

0x8048473 <main+11>: mov    DWORD PTR [%ebp-4],%eax

0x8048476 <main+14>: call   0x8048398 <getuid>

0x804847b <main+19>: mov    DWORD PTR [%ebp-8],%eax

0x804847e <main+22>: push   0x80486c0

0x8048483 <main+27>: call   0x8048358 <system>

0x8048488 <main+32>: add    %esp,4

0x804848b <main+35>: cmp    DWORD PTR [%ebp-4],0xbb9

0x8048492 <main+42>: jne    0x80484a1 <main+57>

0x8048494 <main+44>: push   0x80486e0

0x8048499 <main+49>: call   0x8048388 <printf>  //level1

0x804849e <main+54>: add    %esp,4

0x80484a1 <main+57>: cmp    DWORD PTR [%ebp-4],0xbba

0x80484a8 <main+64>: jne    0x80484b7 <main+79>

0x80484aa <main+66>: push   0x8048700

0x80484af <main+71>: call   0x8048388 <printf>  //level2

0x80484b4 <main+76>: add    %esp,4

0x80484b7 <main+79>: cmp    DWORD PTR [%ebp-4],0xbbb

0x80484be <main+86>: jne    0x80484cd <main+101>

0x80484c0 <main+88>: push   0x8048740

0x80484c5 <main+93>: call   0x8048388 <printf>  //level3

0x80484ca <main+98>: add    %esp,4

0x80484cd <main+101>: cmp    DWORD PTR [%ebp-4],0xbbc

0x80484d4 <main+108>: jne    0x80484e3 <main+123>

0x80484d6 <main+110>: push   0x8048780

0x80484db <main+115>: call   0x8048388 <printf>  //level4

0x80484e0 <main+120>: add    %esp,4

0x80484e3 <main+123>: cmp    DWORD PTR [%ebp-4],0xbbd

0x80484ea <main+130>: jne    0x80484f9 <main+145>

0x80484ec <main+132>: push   0x80487c0

0x80484f1 <main+137>: call   0x8048388 <printf>  //level5

0x80484f6 <main+142>: add    %esp,4

0x80484f9 <main+145>: cmp    DWORD PTR [%ebp-4],0xbbe

0x8048500 <main+152>: jne    0x804850f <main+167>

0x8048502 <main+154>: push   0x8048800

---Type <return> to continue, or q <return> to quit---

0x8048507 <main+159>: call   0x8048388 <printf>  // ...

0x804850c <main+164>: add    %esp,4

0x804850f <main+167>: cmp    DWORD PTR [%ebp-4],0xbbf

0x8048516 <main+174>: jne    0x8048525 <main+189>

0x8048518 <main+176>: push   0x8048840

0x804851d <main+181>: call   0x8048388 <printf>

0x8048522 <main+186>: add    %esp,4

0x8048525 <main+189>: cmp    DWORD PTR [%ebp-4],0xbc0

0x804852c <main+196>: jne    0x804853b <main+211>

0x804852e <main+198>: push   0x8048880

0x8048533 <main+203>: call   0x8048388 <printf>

0x8048538 <main+208>: add    %esp,4

0x804853b <main+211>: cmp    DWORD PTR [%ebp-4],0xbc1

0x8048542 <main+218>: jne    0x8048551 <main+233>

0x8048544 <main+220>: push   0x80488c0

0x8048549 <main+225>: call   0x8048388 <printf>

0x804854e <main+230>: add    %esp,4

0x8048551 <main+233>: cmp    DWORD PTR [%ebp-4],0xbc2

0x8048558 <main+240>: jne    0x8048567 <main+255>

0x804855a <main+242>: push   0x80488e0

0x804855f <main+247>: call   0x8048388 <printf>

0x8048564 <main+252>: add    %esp,4

0x8048567 <main+255>: cmp    DWORD PTR [%ebp-4],0xc14

0x804856e <main+262>: jne    0x804857d <main+277>

0x8048570 <main+264>: push   0x8048920

0x8048575 <main+269>: call   0x8048388 <printf>

0x804857a <main+274>: add    %esp,4

0x804857d <main+277>: cmp    DWORD PTR [%ebp-4],0xc15

0x8048584 <main+284>: jne    0x8048593 <main+299>

0x8048586 <main+286>: push   0x8048960

0x804858b <main+291>: call   0x8048388 <printf>

0x8048590 <main+296>: add    %esp,4

0x8048593 <main+299>: cmp    DWORD PTR [%ebp-4],0xc16

0x804859a <main+306>: jne    0x80485a9 <main+321>

0x804859c <main+308>: push   0x80489a0

0x80485a1 <main+313>: call   0x8048388 <printf>

0x80485a6 <main+318>: add    %esp,4

0x80485a9 <main+321>: cmp    DWORD PTR [%ebp-4],0xc17

0x80485b0 <main+328>: jne    0x80485bf <main+343>

---Type <return> to continue, or q <return> to quit---

0x80485b2 <main+330>: push   0x80489e0

0x80485b7 <main+335>: call   0x8048388 <printf>

0x80485bc <main+340>: add    %esp,4

0x80485bf <main+343>: cmp    DWORD PTR [%ebp-4],0xc18

0x80485c6 <main+350>: jne    0x80485d5 <main+365>

0x80485c8 <main+352>: push   0x8048a20

0x80485cd <main+357>: call   0x8048388 <printf>

0x80485d2 <main+362>: add    %esp,4

0x80485d5 <main+365>: cmp    DWORD PTR [%ebp-4],0xc19

0x80485dc <main+372>: jne    0x80485eb <main+387>

0x80485de <main+374>: push   0x8048a60

0x80485e3 <main+379>: call   0x8048388 <printf>

0x80485e8 <main+384>: add    %esp,4

0x80485eb <main+387>: cmp    DWORD PTR [%ebp-4],0xc1a

0x80485f2 <main+394>: jne    0x8048601 <main+409>

0x80485f4 <main+396>: push   0x8048aa0

0x80485f9 <main+401>: call   0x8048388 <printf>

0x80485fe <main+406>: add    %esp,4

0x8048601 <main+409>: cmp    DWORD PTR [%ebp-4],0xc1b

0x8048608 <main+416>: jne    0x8048617 <main+431>

0x804860a <main+418>: push   0x8048ae0

0x804860f <main+423>: call   0x8048388 <printf>

0x8048614 <main+428>: add    %esp,4

0x8048617 <main+431>: cmp    DWORD PTR [%ebp-4],0xc1c

0x804861e <main+438>: jne    0x804862d <main+453>

0x8048620 <main+440>: push   0x8048b20

0x8048625 <main+445>: call   0x8048388 <printf>

0x804862a <main+450>: add    %esp,4

0x804862d <main+453>: cmp    DWORD PTR [%ebp-4],0xc1d

0x8048634 <main+460>: jne    0x8048643 <main+475>

0x8048636 <main+462>: push   0x8048b60

0x804863b <main+467>: call   0x8048388 <printf>  //level20

0x8048640 <main+472>: add    %esp,4

0x8048643 <main+475>: leave  

0x8048644 <main+476>: ret    

0x8048645 <main+477>: nop    

0x8048646 <main+478>: nop    

0x8048647 <main+479>: nop    

0x8048648 <main+480>: nop    

---Type <return> to continue, or q <return> to quit---

0x8048649 <main+481>: nop    

0x804864a <main+482>: nop    

0x804864b <main+483>: nop    

0x804864c <main+484>: nop    

0x804864d <main+485>: nop    

0x804864e <main+486>: nop    

0x804864f <main+487>: nop    

End of assembler dump.

(gdb) 

여기서 어셈블리코드를 분석해 보면 현재 접속해 있는 유저의 uid를 얻은다음 해당 uid와 일치하는 패스워드를 출력해주는 프로그램이라는것을 알수 있습니다. 그럼 이제 우리가 주목해야 할것은 바로 각 레벨의 printf전에 나오는 주소가 push되는것입니다. 간단하죠? 이제 저 주소에 있는 문자열을 불러오면 원하는 레벨의 패스워드를 확인할수 있습니다.

 

(gdb) x/s 0x80486e0

0x80486e0 <_IO_stdin_used+60>:  "\nLevel1 Password is \"level1\".\n\n"

이런식으로 원하는 레벨의 패스워드를 확인할수 있습니다.

'Hackerschool > FTZ 부가설명' 카테고리의 다른 글

find명령어  (0) 2015.01.29