[ftz] level 14: what that nigga want?
14_루틴 분기 키값의 이해(1)
√ 분기 루틴?
: 특정 조건을 만족할 때 분기하는 루틴
ex. SW 설치 시 시리얼키를 입력받는 것
- 은근 빠지지 않고 출제되는 문제!
- 스택 가드와 비슷한 개념. 메모리에 저장돼 있는 값을 정확하게 분석할 수 있는가?
- buf는 20byte 크기인데, fgets로 입력은 45byte까지 받게 되어있다.
>> buf에 쉘코드를 다 담을 수 없으며, 환경변수를 이용해야 한다.
담을 필요 없었다.
- check의 값이 0xdeadbeef여야 한다.
check 변수는 초기화되지 않았으니, 임의의 쓰레기값이 할당되어 있을 것.
√ gdb로 소스코드 분석
- 함수 프롤로그 부분
- main+3> stack에 56byte 공간 확보
: crap[4] check[4] buf[20] dummy[28]
** dummy 공간
: CPU가 값을 빠르게 읽어들일 수 있도록 CPU의 비트 수에 따라 더미가 적절한 공간에 들어가서
변수의 간격을 유지하게 됨
>> fgets(ebp-56, 0x2d, 0x8049664)
= fgets(buf, 45, stdin)
- ebp-16(check)과 0xdeadbeef 비교
같지 않으면 main+75로 JMP
>> setreuid(3095, 3095)
>> system("/bin/sh")
buf 배열과 check의 간격
(ebp-56)-(ebp-16) = 40byte
buf[20] |
dummy[20] |
check[4] |
crap[4] |
dummy[8] |
SFP[4] |
RET[4] |
* 위 스택은 4byte 단위로 변수가 배열되는 그림.
√ 공격
** 페이로드
NOP[40] + 0xdeadbeef
- buf에 최대 문자열 fgets()로 44개 받을 수 있으니 buf[20] + dummy[20] +
"0xdeadbeef"로 채우기 (by Little endian 방식)
Level 15 Password = guess what
* 변수 할당 공간 확인 예제
'write-up > pwnable' 카테고리의 다른 글
[ftz] level 16: about to cause mass (0) | 2019.08.24 |
---|---|
[ftz] level 15: guess what (0) | 2019.08.24 |
[ftz] level 13: have no clue (0) | 2019.08.23 |
[ftz] level 12: it is like this (0) | 2019.08.21 |
[ftz] level 11: what!@#$? (0) | 2019.08.21 |
댓글