ID : level13
PW : have no clue
1.
hint를 뜯어보자. level11와 상당히 유사하지만, long i가 추가된 걸 확인할 수 있다.
- main(int argc, char *argv[]) // 인자를 받음
- long → 정수형변수, 4바이트
해석해보자면, i를 4바이트로, buf를 1024바이트로 선언했다.
렙14권한이 걸리고, 인자(인자가 argv임)가 전달되면 buf에 argv[1]을 복사하여 넣는다.
만약 i가 0x1234567이 아니라면 프로세스는 죽는다. (kill은 잘 모르겠음 추후 수정)
strcpy함수가 쓰이고 버퍼의 크기에 대해 아무 언급이 없는걸 보면 버퍼오버플로우 문제라는 걸 알 수 있겠지?
바로 attackme를 tmp디렉토리로 복사하여 디버깅 해보자!
(+그냥 attackme를 실행 해보면 아무것도 안 뜬다.) 왜지?
(+궁금증 : argc>1 어케 만족한거?
+궁금증 해결 : argc는 메인함수에 전달된 인자의 개수! 인자가 전달됐으니까 당연히 1보다 크지.)
2.
<main+3>부분을 보면, 0x418만큼 공간이 할당되었다는 것을 알 수 있다. 0x418은 10진수로 1048이다.
(<main+16>은 어떻게 해석하지? → 코드를 실행하며 필요한 부수적 공간. 지금은 신경쓰지 말기.)
아까 위의 코드에서, i가 먼저 선언되고 → buf가 선언 됐으니까 그릇이 차곡차곡 쌓이는 것처럼 i가 먼저 쌓이고 그 다음 buf가 쌓이겠지?
(여기서 나는 좀 헤맸는데, ret와 sfp의 저장공간은 맨 위의 프롤로그로 대체한다는 것이다. 무슨 말이냐면 함수가 실행되면 ret와 sfp는 너무나 당연하게 4바이트씩 총 8바이트를 차지하지 않냐. 당연하기 때문에 굳이 디버깅 할때 숫자로 저장공간이 얼마예요~ 말 안해주는 것임. 그러므로 디버깅 할때, 이미 ret와 sfp는 8바이트고~ 그 다음 할당된 공간은 sfp위에서부터 쌓이는 것들의 저장용량이라고 생각하면 된다. 한마디로 ret와 sfp는 숫자로 안 쓰여있음!)
그럼 스택 구조를 그리면, 이렇게 된다. (1048 = 8+4+12+1024)
buf [1024] -낮은 주소
dummy [12]
i [4]
dummy [8]
SFP [4]
RET [4] -높은 주소
변수를 선언해서 스택에 쌓일 때는 높은 주소부터 그릇처럼 차곡차곡 쌓인다.
함수(stcpy, gets 같은..)로 값을 넣어줄 때는 젤 낮은 (시작)주소부터 높은 주소로 역으로 값을 채워나간다.
선언은 높→낮! 값 넣을땐 낮→높!
그래서 우리는 [NOP를 1036바이트 + i를 4바이트 + NOP를 12바이트 + 환경변수 주소] 이렇게 페이로드를 작성하면 된다!
i를 NOP로 채워주지 않고 따로 값을 넣어주는 이유는,
hint코드에서 i가 0x1234567이 아니면 kill하기 때문에 i에 0x1234567을 넣어주는 것이다. 렙11에서 내용이 추가된걸 알 수 있다 ㅎ
3.
그럼 이제 환경변수에 쉘코드를 넣어주고, 그 환경변수의 주소를 구하면 되겠지?
환경변수를 선언하고 그 안에 쉘코드를 넣어줬다.
위에서 선언한 환경변수의 주소를 구하는 코드를 만들고 컴파일 한 후 실행했다. (렙11에 코드 있음)
페이로드
./attackme python -c 'print "\\x90"*1036 + "\\x67\\x45\\x23\\x01" + "\\x90"*12 + "\\x1e\\xfb\\xff\\xbf"'
페이로드대로 입력하면, 레벨 14의 쉘이 따진다!!
추가. ASLR 특징 이용하여 쉘 따는 방법
buf의 시작주소를 구해야함. 그래야 페이로드 짬.
- strcpy 호출된 다음인 <main+66>에 bp.
- r AAAA 같은 거 입력해서 41이 언제부터 나오는지 확인 (buf 시작주소 구한거임)
- 페이로드 : NOP(1011) + Shell Code(25) + i(4) + NOP(12) + buf시작주소
(2020.02에 작성한 글을 가져왔습니다.)
'Pwnable > FTZ' 카테고리의 다른 글
[FTZ] level 15 풀이 <BOF-포인터> (0) | 2024.01.18 |
---|---|
[FTZ] level 14 풀이 <BOF-그냥덮> (0) | 2024.01.18 |
[FTZ] level 12 풀이 <BOF-gets> (0) | 2024.01.18 |
[FTZ] level 11 풀이 <BOF-strcpy> (0) | 2024.01.18 |
[FTZ] level 10 풀이 <공유메모리> (0) | 2024.01.18 |