일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Docker
- col -1 from CursorWindow
- 나이순 정렬
- 백준
- pwnable.kr
- pwnable
- 코틀린
- cmd1
- 애너그램 그룹
- SQLiteConstraintException
- Drive-By-Download
- 액션바 필요없숴
- java.lang.IllegalStateException
- cmd2
- python
- UNIQUE constraint failed
- kotlin
- tlqkf
- 10814
- 클라우드란?
- 6566
- Couldn't read row 0
- 블록체인
- 페니빙
- 파이썬
- Make sure the Cursor is initialized correctly before accessing data for it.
- 쏘큩
- pwable.kr
- 포너블
- 클라우드가 뭐야
- Today
- Total
푸르미르
pwnable.kr 14. cmd1 본문
cmd1.c 의 코드를 잘 살펴보겠다.
main함수부터 보면,
PATH를 /thankyouverymuch로 설정한다.
그리고 filter함수를 argv[1]인 아이를 매개변수로 전해주며 실행한다. 이 filter함수의 결과가 true(1)이면 프로그램 종료가
되고 그렇지 않으면(false, 0) system( argv[1] ); 명령을 실행한 후 프로그램 종료가 된다. 그렇다면 filter함수는 뭐하는 함수인가?
filter함수에서,
strstr함수는 매개변수로 들어온 아이(문자열)에서 "flag", "sh", "tmp" 이 3개의 문자열이 있을 경우 인덱스의 값을 리턴하지만, 존재하지 않을 경우, null갑을 리턴해주는 함수이다. 그런데 이 strstr함수의 리턴값이 0과 다를 경우, 즉 주어진 문자열들 중 argv[1]에 존재할 경우 r에 더해지게 된다. 그리고 0이 아닌 값인 r 값은 return되게 된다.
우리가 원하는 flag값을 얻기 위해서는 이 r값이 0이여야 프로그램을 종료시키지 않고 flag확인 후 종료시킬 수 있다.
-> flag, sh, tmp 문자열이 있어야함.
여기서 섣부르게 ./cmd1 "/bin/cat flag" 라 할 경우 망한다. flag가 필터링되기 때문에 볼 수 없다.
이럴 때 와일드카드(*)문자를 사용하면 flag가 필터링 되지 않고 볼 수 있게 된다.
./cm1 "/bin/cat fla*" 이렇게 말이다. *(와일드카드)는 앞의 문자들로 시작하는 파일을 가리킬 수 있다.
이 ssh로 ls를 했을 경우 fl, f, fla로 시작하는 파일은 flag 하나이기 때문에 여러 argv[1]를 생각해낼 수 있다.
./cm1 "/bin/cat f*"
./cm1 "/bin/cat fl*"
./cm1 "/bin/cat fla*"
flag값이 동일하게 등장하는 것을 확인할 수 있다.
'SECURITY > pwnable' 카테고리의 다른 글
WEBHACKING.KR 38 (0) | 2021.11.17 |
---|---|
pwnable.kr 15. cmd2 (0) | 2021.05.18 |
pwnable.kr 13. lotto (0) | 2021.05.11 |
pwnable.kr 12. blackjack (0) | 2021.05.11 |
pwnable.kr 11. coin1 (0) | 2021.05.05 |