일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- leg
- Softmax classification
- Python
- pwnable.kr
- 기능개발
- AI
- 인공지능
- 텐서플로
- Linear_regression
- Algorithm
- logistic regression
- tensorflow
- programmers
- Today
- Total
나혼자 공부장
[FTZ] Level 19 write-up 본문
hint 파일을 보면, gets 함수로 buf를 받을 때 인덱스 갯수를 제한하지 않고 있다.
이번에도 역시 BOF를 이용해서 푸는 문제겠다.
패스워드를 알아내기 위해 우리가 해결해야할 문제는 크게 두가지다.
1. 코드에 setreuid() 와 같은 권한 설정을 해주는 부분이 없다.
2. 쉘로 떨어지는 부분이 없다.
공격대상 파일은 setuid 설정이 되어있는 상태긴 하지만,
rethat 7.0 이후부터 만큼은 쉘을 실행시킬 때 만큼은 drop privileges 정책에 의해 ruid 로 실행된다.
일반 setuid는 euid만 바꿔주는 것이고 ruid는 그대로기 때문에 setreuid() 함수로 따로 처리해주지 않으면 쉘을 실행해봤자 권한이 그대로인 상태로 실행된다.
따라서 아래와 같은 코드가 추가적으로 실행되어야한다고 생각하면 되겠다.
setreuid(3100,3100); //level20의 id uid 번호
system("/bin/sh");
level20의 uid 번호는 위 명령어로 알아낼 수 있다.
일단 공유라이브러리를 여러개 이용하는 거니까 RTL Chaining 기법이라는건 확실해진다.
일단 여기까지의 정보로 스택을 구상해보자.
일단 내가 이 스택 구조에서 혼란스러웠던 부분을 정리해보았다.
1. 왜 파라미터 주소가 ebp+8인가
call 로 호출할 때는 sfp 다음에 ret이 오기 때문에, sfp+ret+dummy+addr 로 파라미터의 주소는 ebp+12가 된다. 그러나 return으로 함수 호출 시 call 과는 달리, return 주소를 남기지 않고 호출되기 때문에 파라미터 호출 logical address가 달라진다. 결과적으로 sfp+dummy+addr 이 되므로 ebp+8에 파라미터가 와야한다.
2. 함수와 인자 사이에 dummy가 있어야 하는 이유가 무엇인가
system() + dummy(4 byte) + parameter addr
이 순서가 RTL의 정석이라고 알고 있는데, dummy는 사실 그냥 쓸모없는 부분이 아니고 system 함수가 return하는 주소이다. 보통 RTL Chaining으로 여러개의 함수를 이어 실행해야 하는게 아닌 이상 return 주소가 무엇이냐는 상관이 없으니까 dummy로 채우는 것이다.
3. Gadget 을 왜 추가해줘야하는가
우리는 setreuid 뒤에 system 함수를 이어줘야하니까, setreuid 함수가 종료된 후 system 함수에 원하는대로 파라미터를 전해주기 위해 이전 함수의 파라미터를 정리해주는 Gadget가 반드시 필요하다. setreuid 함수의 경우 인자가 두개니까 pop을 두번하는 ppr 과정이 필요하다.
그럼 위 스택 구조를 이루기 위해서 필요한 재료는 setreuid(), system() 함수의 주소와 각각의 파라미터, 그리고 ppr gadget의 주소가 되겠다.
하나씩 구해보자.
pop pop ret 을 수행하는 부분 중 0x804849d 를 선택하겠다. (이것도 아무거나 고르면 안 되고, pop 해서 어디에 저장하는지 보고 해야한다)
system() : 0x4203f2c0
/bin/sh : 0x42127ea4
setreuid() : 0x420d7920
ruid, euid : 0xc1c
PPR gadget : 0x804849d
재료는 모두 구해졌다. 이제 스택 구조를 그대로 반영해서 페이로드를 짜보자.
(python -c 'print "\x90"*44+"\x20\x79\x0d\x42"+"\x9d\x84\x04\x08"+"\x1c\x0c\x00\x00"*2+"\xc0\xf2\x03\x42"+"\x90"*4+"\xa4\x7e\x12\x42"';cat) | ./attackme
PW : we are just regular guys
'pwnable > FTZ' 카테고리의 다른 글
[FTZ] Level 17 write-up (0) | 2019.11.20 |
---|---|
[FTZ] Level 15 write-up (0) | 2019.11.20 |
[FTZ] Level 11 풀이 (0) | 2019.11.13 |