본문 바로가기
System Hacking/해커스쿨 F.T.Z Hacking Zone

해커스쿨 F.T.Z Level 19

by En_Geon 2020. 2. 29.

level 19 로그인 후 hint를 본다.

 

level 19 hint

 

level 18에 비해 코드가 엄청나게 간단해졌다. 그러나 간단해져도 너무 간단해졌다.

사용자를 바꾸는 setreuid 함수까지 없는 간단한 코드가 되어서 level 11에서 만들었던 쉘코드만으로는 해결할 수가 없다. level 11 쉘코드로 실행하면 사용자 변경 없이 그냥 쉘코드가 실행된다.

 

level 19 hint와 같이 글로 준 hint를 합쳐 생각하면 setreuid를 실행하는 쉘코드를 만들어 이전 쉘코드와 함께 사용하면 된다.

 

 

setreuid 쉘코드

 

사용자 ID를 바꾸는 setreuid 함수의 인자로는 사용자 ID에 해당하는 uid이다. 쉘코드를 만들기 위해서는 얻고 싶은 ID의 uid를 알아야 한다.

 

level 20 uid

 

level 20의 uid는 3100이다. 인자를 알았으면 쉘코드 실습에서 배웠던 시스템 콜 번호를 알아야 한다.

 

unistd.h 위치

 

위 위치에 있는 파일을 열어야 시스템 콜 번호를 볼 수 있다.

 

setreuid system call 

 

이때 setreuid 함수의 시스템 콜 번호는 70이다.

 

setreuid를 만들기 위한 준비는 끝이 났다.

 

setreuid C언어

 

이 코드를 어셈블리 언어로 작성해 기계어를 봐야 한다.

 

setreuid 어셈블리

 

어셈블리어로 작성하고 분석하면 이렇게 된다.

 

setreuid 어셈블리 분석

 

어셈블리에서는 16진수로 바꿔 작성해야 한다.

objdump로 기계어를 본다.

 

objdump setreuid

 

NULL 코드가 없는 기계어가 잘 만들어졌다. 

setreuid의 쉘코드는 "\x31\xc0\xb0\x46\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xcd\80"이다.

 

 

더보기

 

이 쉘코드를 eggshell에서 만든 쉘코드 앞에 넣어주면 된다.

 

eggshell shellcode 배열

 

환경변수에 넣어주는 eggshell 만들 때 shellcode 배열 제일 앞에 setreuid 쉘코드를 넣어주면 된다.

 

이제 gdb로 스택 구조를 분석해본다.

 

gdb attackme

 

스택 구조

 

buf[20] 20byte
dummy 20byte
SFP 4byte
RET 4byte

 

스택 구조를 알았으니 공격을 하면 된다.

우선 쉘코드의 주소를 알아온다.

 

shellcode 주소

 

주소까지 알았으니 공격 코드를 입력한다.

 

공격 실행

 

SFP까지 BOF를 실행해야 하므로 "A"가 44byte 들어간다.

댓글