반응형

HackerSchool FTZ Level 1 풀이 

설치 과정은 잘 나와있으므로 전부 생략

풀이 참고 문헌은 문제풀이로 배우는 시스템 해킹 테크닉



먼저 로그인 후 hint가 보이므로 hint 부터 파악

힌트에는 Setuid가 걸린 파일을 찾아야 한다.파일을 찾는데는 find를 쓰면 된다.



find / -perm +6000 -user level2 2>/dev/null


find / -perm +6000 -user level2 2>/dev/null

find : 명령어

/ : 전체 디렉토리

-perm : 파일 권한이 어떻게 되어있는지

+6000 : Setuid나 Setgid가 설정된 파일

-user : 어떤 유저 파일인지

level2 : 유저 이름

2>/dev/null : 에러가 나는 것들은 전부 출력 X
(1>/dev/null하면 에러가 나는거만 출력)


2>/dev/null이 없다면 찾기가 힘듬




/bin/ExecuteMe 파일 확인 





실행시 화면





/bin/bash 실행시키면 바로 level2가 됨.
(/bin/bash말고 sh등등 으로도 level2가 가능)



ADB를 이용하여 /bin/Execute 파일 분석

gdb /bin/Execute


(gdb) disas main


0x08048488

: push %ebp 0x08048489 : mov %esp,%ebp 0x0804848b : sub $0x28,%esp 0x0804848e : and $0xfffffff0,%esp 0x08048491 : mov $0x0,%eax 0x08048496 : sub %eax,%esp 0x08048498 : sub $0xc,%esp 0x0804849b : push $0x8048680 0x080484a0 : call 0x8048358 0x080484a5 : add $0x10,%esp 0x080484a8 : sub $0xc,%esp 0x080484ab : push $0x804868f 0x080484b0 : call 0x8048378 0x080484b5 : add $0x10,%esp 0x080484b8 : sub $0xc,%esp 0x080484bb : push $0x80486a0 0x080484c0 : call 0x80483a8 0x080484c5 : add $0x10,%esp 0x080484c8 : sub $0xc,%esp 0x080484cb : push $0x80486e0 0x080484d0 : call 0x80483a8 0x080484d5 : add $0x10,%esp 0x080484d8 : sub $0xc,%esp 0x080484db : push $0x8048720 0x080484e0 : call 0x80483a8 0x080484e5 : add $0x10,%esp 0x080484e8 : sub $0xc,%esp 0x080484eb : push $0x8048760 0x080484f0 : call 0x80483a8 0x080484f5 : add $0x10,%esp 0x080484f8 : sub $0xc,%esp 0x080484fb : push $0x8048782 0x08048500 : call 0x80483a8 0x08048505 : add $0x10,%esp 0x08048508 : sub $0x4,%esp 0x0804850b : pushl 0x8049948 0x08048511 : push $0x1e 0x08048513 : lea 0xffffffd8(%ebp),%eax 0x08048516 : push %eax 0x08048517 : call 0x8048368 0x0804851c : add $0x10,%esp 0x0804851f : lea 0xffffffd8(%ebp),%eax 0x08048522 : sub $0x8,%esp 0x08048525 : push $0x804879c 0x0804852a : push %eax 0x0804852b : call 0x8048388 0x08048530 : add $0x10,%esp 0x08048533 : test %eax,%eax 0x08048535 : je 0x8048551 0x08048537 : sub $0xc,%esp 0x0804853a : push $0x80487c0 0x0804853f : call 0x80483a8 0x08048544 : add $0x10,%esp 0x08048547 : sub $0xc,%esp 0x0804854a : push $0x0 0x0804854c : call 0x80483c8 0x08048551 : lea 0xffffffd8(%ebp),%eax 0x08048554 : sub $0x8,%esp 0x08048557 : push $0x80487e8 0x0804855c : push %eax 0x0804855d : call 0x8048388 0x08048562 : add $0x10,%esp 0x08048565 : test %eax,%eax 0x08048567 : je 0x8048583 0x08048569 : sub $0xc,%esp 0x0804856c : push $0x8048800 0x08048571 : call 0x80483a8 0x08048576 : add $0x10,%esp 0x08048579 : sub $0xc,%esp 0x0804857c : push $0x0 0x0804857e : call 0x80483c8 0x08048583 : sub $0xc,%esp 0x08048586 : push $0x8048826 0x0804858b : call 0x80483a8 0x08048590 : add $0x10,%esp 0x08048593 : sub $0x8,%esp 0x08048596 : push $0xbba 0x0804859b : push $0xbba 0x080485a0 : call 0x80483b8 0x080485a5 : add $0x10,%esp 0x080485a8 : sub $0xc,%esp 0x080485ab : lea 0xffffffd8(%ebp),%eax 0x080485ae : push %eax 0x080485af : call 0x8048358 0x080485b4 : add $0x10,%esp 0x080485b7 : leave 0x080485b8 : ret 0x080485b9 : nop 0x080485ba : nop 0x080485bb : nop
함수를 Call하는 부분을 크게 살펴보자면

system -> chdir -> printf *5 -> fgest -> strstr -> printf -> exit -> printf -> setreuid -> system


main+16까지는 함수 프롤로그 및 esp자리 확보이므로 넘긴다.

main+19에 push $0x8048680이 있다 여기엔 /usr/bin/clear값이 있고

다음 system함수를 만나 화면을 clear하게 된다.


main+13에 chdir한다. main+35에 0x804868f이 push되었으므로 여기엔 아래와 같은 값이 있다.


여기까지 정리하자면 /usr/bin/clear로 화면을 밀고, /hmoe/level2로 디렉토리를 옮긴다.


다음은 printf문구가 5번 나오는데 각각 값이 뭐가 들어가 있는지 확인 해보자.

main+51,67,83,99,115의 값을 확인해보면 다음과 같다.


main+131에 0x8049948을 Push하는데 여기에 stdin값는다


main+137에 0x1e(30)를 push하고 여기서 사이즈를 받는다.

main+139에 lea 0xffffffd8(%ebp), %eax를 통하여 배열주소를 받는다. 따라서. 

main+143와 결합하면 fgets(배열주소, 사이즈(30), stdin)이 될 것이다.

main+157에 0x804879c에는 my-pass라는 값이 들어가 있다.

main+157의 값을 가져와 main+163에서 비교를 한다. 

main +171 ~ 196은 만약 값을 비교해서 my-pass가 나왔다면 아래의 출력이 나오고 exit가 된다.

main +201 ~ 246도 my-pass가 아닌 chmod를 검사하고 같으면 exit로 종료된다.

main +270 ~ 280 에 0xbba를 10진수로 바꾸면 3002이다. setreuid(3002,3002)로 level2의 ID를 나타낸다.

main +285 ~ 295는 아까 입력했던 값을 level2의 id의 권한으로 system(입력값)이 된다. 

그래서 이 입력값에 /bin/bash나 sh등을 입력하면 level2로 쉘이 열리게 된다. 


main + 300 ~ 이후는 함수 에필로그이다. 




(gdb) set disassembly intel(att)


로 디스 어셈블리 코드를 다르게 볼 수 있다.


반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기