코드를 보면 이제 스택영역을 사용할 수 없게 되었습니다. RTL이라는 기법을 사용합니다. RTL 을 사용하기 위해 system 함수의 주소를 알아냅니다. 그리고 system 함수의 인자로 “/bin/sh” 를 사용할 것이기 때문에 “/bin/sh”의 주소를 찾아주는 코드를 작성합니다. “/bin/sh” 의 주소를 알아냈습니다. 0x400fbff9 payload 구성은 | buffer [40] | SFP [4] | RET(system 함수주소)[4] | Dummy [4] | 인자(“/bin/sh”)[4]| 로 구성됩니다. system 함수 주소와 “/bin/sh” 사이에 왜 더미가 생기는지 궁금하시면FTZ Level11 (RTL) 편을 보시면 됩니다. 쉘이 따인것을 확인 할 수 있습니다.
코드를 살펴보면 main은 마지막에 problem_child 함수를 부르고 끝내는 것을 알 수 있다. 그리고 problem_child 함수는 버퍼는 40만큼 생성하는데 strncpy로 41byte 만큼 버퍼에 복사시키는 것으로 보아 여기서 1byte Overflow가 발생한다는 것을 알 수 있다. 하지만 그렇게 되면 우리는 RET의 주소를 변경시키지 못하게 되는데, 이때 사용할 수 있는 기법이 FPO 이다. 함수가 시작할 땐 함수 프롤로그, 종료될 땐 함수 에필로그가 된다. 함수 에필로그의 구성은 leave와 ret으로 구성되어 있다. leave 는 mov esp ebp, pop ebp 를 수행한다. 즉, esb를 ebp 로 쭉 잡아 땡기고 ebp를 pop 시킨다. ebp가 pop이 되면 esp는 +4의..
- Total
- Today
- Yesterday
- HarekazeCTF
- 0ctf
- OllyDbg
- orge
- 클래스
- darkknight
- angry_doraemon
- babypwn
- TAMUCTF
- babyheap
- succubus
- luckyzzang
- picoctf
- lob
- Golem
- bugbear
- C언어
- ftz
- 포너블
- 올리디버거
- 비교 연산자
- Codegate
- Pwnable.kr
- BaskinRobins31
- zombie_assassin
- protostar
- 파이썬
- Nightmare
- Python
- 리버싱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |