디렉토리 확인
hint
여기서 setreuid는 다시 ruid, euid를 각각 원하는 대로 변경가능한 함수
ruid : 프로세스 실제 소유자
euid: SetUID 권한이 설정된 실행 파일에 의해 변경된다.
euid는 일시적으로 다른 계정의 uid 저장하고,
euid에 저장된 uid에 따라 프로세스의 권한이 결정된다.
여튼 내용보니 strcpy를 이용해 bof 하면 될 것 같다.
argv[1]에 넣을 쉘 코드 만들기
1. 쉘을 만들 간단한 C코드
2. 컴파일 후 objdump를 이용해 어셈코드 확인
main
execve
여기서 중요한 어셈블리만 뽑아서
위 메인함수의 execve(sh[0],sh,NULL); 에 필요한 최소한의 어셈코드를 작성
컴파일 후 확인
밑에 보면 이 쉘코드는 NULL이 포함된 쉘코드 -> 정상적으로 실행 안할 가능성 있으니 NULL제거 작업
NULL을 제거한 어셈코드
xor 이용해서 null제거
mov $0x0 %eax -> xor %eax %eax
이걸로 push $0x0할거 0값을 가진 레지스터(ex. eax)를 push
NULL제거한 어셈코드 정상적으로 실행하는 지 확인
어셈코드 확인하고 주요 어셈블리만 쉘코드로 작성
“\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”
-> 이어적어도 상관X
쉘코드
”\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”
쉘코드를 실행하는 코드 작성
이제 argv[1]에 넣기 위해 argv[1]에 할당된 크기 확인
main 함수의 어셈코드를 확인해 보면
0x108=264byte 만큼 할당 되어있음
sfp(4byte)+ret(4byte)= 272byte
268byte(dummy+shellcode)+4byte(ret) 입력하면 완성
shellcode크기를 뺀 나머지만큼 '\x90'로 채워주고 ret에 shellcode의 시작주소를 넣는다.
(사실 '\x90'가 있는 아무주소나 때려넣으면 된다. - nop슬라이드 기법)
"it is like this"
*참고
1. 0xbffffb20(쉘코드 시작주소)가 안먹혀서 0xbffffb21을 넣어야 한다.
2. perl -e 명령어를 사용하면 메모리에 \x90 -> \xc290 으로 잘못 인식된다.(크기: 2->4byte)
왜? 엔코딩이 utf로 설정되있어서 \x90입력할 때 utf형식으로 2byte가 들어가기 때문
해결: export lang= , export lang=en_us 처럼 비워주거나 en_us입력
'시스템 > FTZ' 카테고리의 다른 글
hackerschool FTZ : level 5 풀이 (0) | 2019.03.28 |
---|---|
hackerschool FTZ : level4 풀이 (0) | 2019.03.28 |
hackerschool FTZ : level 3 풀이 (0) | 2019.03.27 |
hackerschool FTZ : level2 풀이 (0) | 2019.03.27 |
hackerschool FTZ : level1 풀이 (0) | 2019.03.27 |