ID : level13

password : have no clue

 

1) hint 파일의 내용은 다음과 같다.

argc 의 크기가 1초과 , 즉, 2 이상이 되어야 

strcpy로 오버플로를 발생할수 있다는 이야기,

 

2) GDB 명령어를 통해 어셈블리어로 변환을 해보면,

다음과 같다.

16진수 418 을 10진수로 변환하면 

1048 이고, 문제에서 buf의 크기는 1024 이므로, 

buf[1024] + dummy[24] +sfp[4] + ret[4] 

가 된다, 

 

11, 12 문제와 마찬가지로, 쓰레기값을 채워주고, ret 에 환경변수 주소를 넣어주면 될것이다.

 

3) 먼저 환경변수를 생성해 준다, 

 

그리고 해당 환경변수의 주소를 알수있는 코드를 작성!

 

4) vi 편집기를 열어 해당 코드를 저장하고 컴파일 수행,

 

5) 해당 환경변수의 주소는

0xbffffc90 이다!

 

6) 실행을 하니

Buffer Overflow !!!

라는 문장이 출력되었다

 

코드를 다시보면

i 가 1234567 과 일치하지 않으면, 해당 문자열을 출력한다,

결국 1234567이 되도록 문자열의 인자값을 전달해 주어야 한다.

 

7) 어셈블리어를 다시 확인해 보면 이부분이 if 문인것같다.

0x1234567 과 0xffffffff4 를 비교하는걸로 보아

변수 i 의 주소는 0xfffffffff4 임을 추측할수 있다.

 

이를 쉽게 보기 위하여 intel 코드로 다시 변환하면

8) intel 코드로 변환하면 위와 같다,

 

계산을 해보면,

buf 변수에서 sfp 까지의 거리는 1048 이다,

그리고 변수 i 는 ebp-12 로 표기 되어 있으므로,

i 부터 sfp 까지의 거리는  12 임을 알수있다, 

 

그럼 buf 에서 i 까지의 거리는

1048 - 12 = 1036 

 

1036 이 변수 i 까지의 거리이고, 

변수 i 는 01234567 이 저장되므로 4byte 가 된다,

 

buf 의 크기는 1024, buf 부터 i 까지의 거리는 1036 이므로,

buf 와 i 사이의 dummy 크기는 12 ,

 

변수 i 와 sfp 사이의 거리는 12 이고, i 는 4byte 이므로, 

i 와 sfp 사이의 dummy는 8byte 가 된다, 

 

이를 그림으로 표현하면,

 

이와 같이 된다,

 

그럼 , 

./attackme `python -c 'print "a"*1036+"\x67\x45\x23\x01"+"a"*12+"환경변수 주소값" 

을 입력하면 다음 레벨로 갈수있는 권한이 열릴것이다.

 

9) 다음 비밀번호

"what that nigga want?"

+ Recent posts