일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C++ gui
- C언어
- 코딩
- BOJ
- 프로그래밍
- JUCE라이브러리
- OS
- C++
- go channel
- gui
- 자료구조
- 알고리즘
- JUCE
- C++ library
- c++ heap
- 운영체제
- vim-go
- JUCE library
- 리듬게임
- Docker
- go
- 백준
- 공룡책
- JUCE 튜토리얼
- 연결리스트
- LOB
- a tour of go
- Nebula
- tour of go
- C++ gui 라이브러리
- Today
- Total
CafeM0ca
[FC3]level0 gate 본문
ID:gate
PW:gate
ssh로 접속해야한다. 처음에 이걸 몰라가지고 한참 어리둥절했었는데.. 벌써 그게 4달전이다.
ssh gate@ip
거져주는 문제같지만 보호기법때문에 까다롭다.
main+81부분을 보면 strcpy를 호출하고 있다. 인자로 ebp-264가 들어가니 스택을 확인해보면
buffer(256) | dummy(8) | sfp(4)=ebp | ret(4)=ebp+4 로 구성되어 있다.
자자..그럼그럼 쉘코드도 사용못하고 라이브러리함수는 1번밖에 호출이 안되는데 system함수를 사용하자니 권한이 다운되어 못써먹는다. exec계열의 함수로만 가능한데 그렇다면 변조된 스택은 아래와 같이 될꺼다.
A(268) | exec계열함수(4) | ret(4) | 인자1(ebp+8) | 인자2 ....
그런데 라이브러리함수는 아스키아머때문에 \x00으로 시작한다. 때문에 strcpy에서 \x00을 만나 페이로드가 끊긴다.
문제 힌트에 fake ebp를 사용하라 했다. Red Hat에서 풀었던 기억을 되감아보면 에필로그를 이용한다.
leave : mov esp ebp
pop ebp
leave전 변조된 스택
A*264(esp=&buffer) | sfp(4 ebp) | ret(4)
leave후 수행 후 스택
A*264 | sfp(4) | ret(esp) | ebp=(sfp의 값)
eip는 ret을 가리킬꺼다. 실행하기전 인자를 참조하게 된다. 인자는 ebp기준 +8부터 첫번째 인자가 들어간다.
leave전 sfp의 값이 (임의의 값)0x8048000이라면 인자가 leave후 ebp의 값은 sfp의 값(0x8048000)이 대입되고 ret의 인자로 ebp+8(0x8048008)이 인자가 된다!!!
어? 그러면 굳이 ret 뒤에 인자를 구성해줄 필요가 없겠네???? -> 유레카
ebp+8(0x8048008)가 첫번째 인자가되고 ebp+12가(0x804800c)가 두번째 인자가되고 ebp+16(0x8048010)이 세번째 인자가된다!!
페이로드는 아래와 같이 구성해주면된다.
"A"*264+인자3개가 나란히 있는 메모리 어딘가의 주소+exec계열의 함수
완벽하다.. 4개월전에는 아리송했는데 시간이 지나서 성숙해진건진 몰라도 모카는 '확실히' 이걸 누구에게든지 설명할 수 있다.
페이로드를 구성하기위해 메모리를 찾아보자.
모카는 execl를 사용할꺼다. execl을 실행하면서 ebp의 프롤로그로 인해 인자 참조가 바뀌면 안되니 0x7a5723(프롤로그가 생략된지점)을 사용할 꺼다.
execl의 첫번째인자는 실행할 프로그램,두번째인자는 인자(실행할 프로그램의 인자?),3번쨰인자는 NULL이 들어가면 된다.
쉘을 실행시키는 프로그램을 심볼릭링크로 첫번째 인자로 연결해주고 두번째인자는 들어갈 인자가없으니 상관없고 GOT영역은 항상 NULL로 끝나니 GOT영역을 심볼릭링크해주면 된다.
GOT(global offset table : 실제 함수 주소가 있는곳)주소를 구하자
0x8049618-8이 ebp에 들어갈 주소다. 0x804954c의 값은 0x01인데 이걸 심볼릭링크를 걸어주면된다.
페이로드는 아래와 같다.
"A"*264+&(got-8)+"execl"
./iron_golem `python -c 'print "A"*264+"\x10\x96\x04\x08"+"\x23\x57\x7a\x00"'`
어라.. 권한이 안올랐다. id를 확인해보면 gate는 500인데..? 알고보니 페도라는 RedHat과 다르게 setuid도 설정해줘야한다.
다시한번 exploit
setreuid몰랐으면 큰일날뻔.. 행복하닷 ㅎㅅㅎ
'Hacking > LOB(Fedora3)' 카테고리의 다른 글
[FC3]level4 evil_wizard (0) | 2018.01.31 |
---|---|
[FC3]level3 hell_fire (0) | 2018.01.29 |
[FC3]level2 dark_eyes (0) | 2018.01.27 |
[FC3]level1 iron_golem (0) | 2018.01.26 |
[FC3]풀이하기 전에 (0) | 2018.01.26 |