ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Write up] FTZ level5 풀이
    정보보안/CTF write-up 2020. 7. 20. 03:24

    level5에 접속하여 디렉터리를 확인해보면 hint가 있습니다.

     

     

    hint에는 level5.tmp라는 임시파일을 생성한다고 합니다.

     

     

    /tmp에 들어가보았지만 아무 파일도 존재하지 않습니다.

     

     

    SetUID가 걸려있는 /bin/level5를 찾아 실행시켜보아도 없는 것을 확인할 수 있습니다. level5.tmp를 생성한 후에 다시 삭제한다고 생각이됩니다.

     

     

    우선 우리에게 권한 영역인 홈디렉터리의 tmp에 passwd.txt라는 파일을 만들어줍니다.

     

     

    passwd.txt 파일에 링크를 걸어줍니다.

     

     

    level5를 실행해준후 passwd.txt를 확인해보면 다음 레벨의 암호가 있는 것을 확인할 수 있습니다.

     

     

     


    추가적으로 이번 문제의 프로그램은 어떻게 작동하기에 위와 같은 동작을 하는지 궁금해졌습니다.

    현재 level5의 권한으로는 파일을 열어볼 수 없습니다. level6 권한의 계정으로 들어간 후에 다시 확인해보겠습니다.

     

    gdb로 해당 파일을 열어보았습니다.

     

    Dump of assembler code for function main:
          0x0804842c <main+0>:	push   %ebp
          0x0804842d <main+1>:	mov    %esp,%ebp
          0x0804842f <main+3>:	sub    $0x8,%esp
          0x08048432 <main+6>:	and    $0xfffffff0,%esp
          0x08048435 <main+9>:	mov    $0x0,%eax
          0x0804843a <main+14>:	sub    %eax,%esp
          0x0804843c <main+16>:	sub    $0x8,%esp
          0x0804843f <main+19>:	push   $0x180
          0x08048444 <main+24>:	push   $0x8048580
          0x08048449 <main+29>:	call   0x804832c <creat>
          0x0804844e <main+34>:	add    $0x10,%esp
          0x08048451 <main+37>:	mov    %eax,0xfffffffc(%ebp)
          0x08048454 <main+40>:	cmpl   $0x0,0xfffffffc(%ebp)
          0x08048458 <main+44>:	jns    0x8048484 <main+88>
          0x0804845a <main+46>:	sub    $0xc,%esp
          0x0804845d <main+49>:	push   $0x80485a0
          0x08048462 <main+54>:	call   0x804835c <printf>
          0x08048467 <main+59>:	add    $0x10,%esp
          0x0804846a <main+62>:	sub    $0xc,%esp
          0x0804846d <main+65>:	push   $0x8048580
          0x08048472 <main+70>:	call   0x804833c <remove>
          0x08048477 <main+75>:	add    $0x10,%esp
          0x0804847a <main+78>:	sub    $0xc,%esp
          0x0804847d <main+81>:	push   $0x0
          0x0804847f <main+83>:	call   0x804836c <exit>
          0x08048484 <main+88>:	sub    $0x4,%esp
          0x08048487 <main+91>:	push   $0x1f
          0x08048489 <main+93>:	push   $0x80485e0
          0x0804848e <main+98>:	pushl  0xfffffffc(%ebp)
          0x08048491 <main+101>:	call   0x804830c <write>
          0x08048496 <main+106>:	add    $0x10,%esp
          0x08048499 <main+109>:	sub    $0xc,%esp
          0x0804849c <main+112>:	pushl  0xfffffffc(%ebp)
          0x0804849f <main+115>:	call   0x804831c <close>
          0x080484a4 <main+120>:	add    $0x10,%esp
          0x080484a7 <main+123>:	sub    $0xc,%esp
          0x080484aa <main+126>:	push   $0x8048580
          0x080484af <main+131>:	call   0x804833c <remove>
          0x080484b4 <main+136>:	add    $0x10,%esp
          0x080484b7 <main+139>:	leave  
          0x080484b8 <main+140>:	ret    
          0x080484b9 <main+141>:	nop    
          0x080484ba <main+142>:	nop    
          0x080484bb <main+143>:	nop    
    End of assembler dump.

    대강 어셈블리 코드를 읽으면 level5.tmp를 만든 후에 문제가 생기면 파일을 바로 지우고 에러에 대해 출력하고, 문제가 없으면 종료하지 않고 파일에 비밀번호를 입력한 후에 remove 함수로 삭제하는 것을 알 수 있습니다.

     

    이 중간에서 링크로 내용을 다른 곳으로 옮겨서 데이터를 유지하는 것입니다.

    반응형
Designed by Tistory.