이 글의 정답이 온전한 정답은 아니며, 여러 방법의 답이 있습니다.

 

 

employees 테이블

문제 풀기 앞서, Intro 문제의 기본적인 테이블은 employees 테이블이며

해당 내용은 위와 같습니다.

 

문제 2 페이지

 

문제)

02. Bob Franco의 부서를 검색하라

개념 : 기본적인 SQL 의 문법을 사용하는 문제네요,

SELECT [ 컬럼 ] FROM [ TABLE]  WHERE [ 조건 ]

명령어를 사용할줄 아는가를 묻는 문제입니다.

 

답)

SELECT DEPARTMENT FROM EMPLOYEES WHERE FIRST_NAME = 'Bob'

또는 

SELECT DEPARTMENT FROM EMPLOYEES WHERE LAST_NAME= 'Franco'

 

2페이지 정답

문제 3 페이지

 

문제)

03. Tobi Barnett 의 부서를 Sales 로 변경하세요

개념 : 데이터의 변경을 묻는 문제입니다. Tori의 부서를 변경하기 위하여

UPDATE 문을 사용하면 됩니다.

기본적 문법은  UPDATE [ TABLE ] SET [ 변경할 컬럼값 ] WHERE [ 조건 ] 입니다.

 

답 )

UPDATE EMPLOYEES SET DEPARTMENT = 'Sales' WHERE first_name = 'Tobi'

3페이지 정답

ID : level17

password : king poetic

 

1) 코드를 먼저 살펴보자!

 

16번과 비슷하다, 

11 번에서 했던 환경변수를 이용하여 오버플로를 발생시키면 풀수있는 문제로 보인다.

 

2) 역시나, 그냥 실행하면

Hello there! 라는 문장만 뜰뿐,

18권한을 획득하지만, 프로그램이 종료되며, 권한을 다시 뺏기게 된다,

 

3) 어셈블리 코드를 확인해보면,

16번 문제와 굉장히 비슷하다, 

buf 부터 sfp 까지의 거리는 56 바이트이고, 

ebp-16 지점부터, 주소값을 받아, 해당 주소를 실행한다.

저 주소값은 역시나 printit 함수의 시작점 일것이다.

 

 

4) 예상대로 시작주소가 맞다.

 

buf 부터 sfp 까지의 거리가 56 바이트 이므로,

56 부터 60까지 의 4바이트는 ret 의 값이다.

 

환경변수에서 쉘을 불러내도록 해보자!

 

5) 너무 쉬울리가 없다...

세그멘테이션 오류가 발생한다.

이 방법은 아닌거같고..

고민을 해보자

 

6) 멍청한..

ebp-16 지점부터 주소를 받아, 해당 주소를 실행한다;;;

저 주소에다가 환경변수의 주소를 넣어주면 되었다...

 

아무튼 18레벨의 비밀번호는

 

"why did you do it"

ID :  level16

password : about to cause mass

 

1) 코드를 먼저 분석하도록 하자!

 

보아하니 

재귀함수로 인하여

Hello there 만 출력될것같다.

 

실행하여 확인해보자

 

2) 예상한것과 같이, 재귀적으로 hello there 만 출력한다.

 shell 함수로 넘어가게끔 공격하면 된다.

다행히 fgets 함수를 이용해보자!

 

 

3) 일단 메인 함수먼저 분석을 하도록 한다,

main+3 을 보니, 56 byte 만큼 할당한것을 볼수있다,

buf 사이즈는 20 이다. 

또한, main+6 열에서,  printit 함수를 호출하는것을 볼수있다.

확인해보자

4) printit 함수의 시작주소가 0x8048500 임을 확인할수 있다,

 

5) 그에 반해, shell 함수의 시작주소는

0x80484d0 임을 확인할수 있을것이다.

 

main 함수의 내용을 보면, 

56 byte 를 할당받고, 

ebp-16 지점부터, 주소값이 들어가면, 해당 주소값으로 이동하는것을 볼수있다.

 

문제에서 ebp-16 지점부터 printit 함수의 시작주소가 들어가 있으므로,

입력을 통해

BOF를 이용하여 ebp-16 지점부터는 0x80484d0 가 들어가게 설정하면,

 

shell 함수로 넘어갈 것이다.

 

buf 의 시작 지점부터 ebp 끝까지의 거리는 56 byte

주소값이 전달되는 지점은 ebp-16 이므로,

 

56 - 16 = 40,

40바이트를 아무 문자로 채우고, 41번째 자리부터 0x80484d0 를 넣어주면 shell 로 넘어간다.

 

 

6) 다음과 같이 입력하여 보자

 

7) level17의 비밀번호 획득

"king poetic"

ID : level15

password : geuss what

 

 

1) 코드를 분석하도록 한다.

포인터 check 가 deadbeef 가 되면, 16권한이 뚫릴것이다.

 

이전의 방식대로 풀어보도록한다.

 

단, 포인터 변수로 선언되었기 때문에 , 직접  값이 아닌, 

0xdeadbeef 변수가 들어있는 주소값을 check 에 넣어주면 된다.

 

2) x/10x main 을 입력하면, 

40byte 까지의 값을 16진수로 나타낼수 있다.

 

0x80484b0 주소 열에 보면, 

0xbeef3881 , 0x2575dead 가 있는것을 확인할수 있다,

 

주소값을 확인하기 위해, 0x80484b0 부터 1씩 늘려가며, 해당 값을 확인해본다.

3) 0x80484b2 주소에 deadbeef가 정확히 들어있다, 

또한, 순서대로 보면 1이 늘어날때마다

다음 주소에서 2글자씩 가져옴을 확인하자~!

 

0xdeadbeef 값이 들어있는 주소는 0x80484b2 이다!

 

이것을 check 변수에 넣어주면 16권한이 열린다!

 

4) 14레벨에서는 뒷 부분까지 모두 적었으나, 

코드를 자세히 살펴보니 단순히 check 변수에 값만 들어가면 된다,

따라서 쉘 코드도 필요 없으므로,

바로 위와 같은 코드를 입력하면

 

5) level 16 의 비밀번호는

"about to cause mass"

 

ID : level14

password : what that nigga want?

 

1) 역시 코드를 하나 알려준다.

어떤지, level13 이랑 비슷해 보인다.

문자열을 입력받아 , 20 크기의 buf 에 45만큼 할당을 하고, ( 오버플로 발생 )

check 와 0xdeadbeef 가 동일하면, 다음 권한의 쉘을 출력해 준다.

 

11, 12, 13 을 통해 연습했으니 풀어보도록 하자.

 

2) intel 코드로 어셈블리어 변환을 한 결과,

buf 로 부터 sfp 까지의 거리는 56 이다,

또한 , check 변수로부터 sfp 까지의 거리는 16임을 확인할수 있다,

 

따라서 

 

buf 부터 check 까지의 거리는

56 - 16  = 40 이다,

 

이를 그림과 같이 표현하면 

이렇게 될것이다.

모든 준비는 끝났으니, 11 , 12 , 13 과 같이 환경변수를 저장하고

해당 주소를 ret 에 넣도록 하자.

 

3) 다음과 같이 입력하고, my-pass 를 입력하면

 

4) 비밀번호는 

"quess what"

+ Recent posts