어떤 파일이 있는지 확인하고 goblin.c를 출력해서 확인한다.

cobolt 문제와 유사하다 다른점은 stdin으로 받는다라는 것 말고 말이다.

 

쉘코드를 작성하여 환경변수로 등록해 놓은후 buffer에 overflow를 일으키면 해결된다.

환경변수 주소 값을 확인하고 페이로드를 작성하자

 

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

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

어떤 파일이 존재하나 확인한후 cat명령어를 이용하여 코드를 확인한다.

 

1번문제와 크게 다를바가 없다 단지 buffer에게 할당된 공간이 매우 작아 쉘 코드를 직접적으로 대입할수 없을 뿐이다.

그렇다면 어떻게 해야 할까?

 

환경변수를 이용하여 미리 작성해둔 후 환경변수의주소로 return 값을 돌리면 된다.

먼저 환경변수를 설정해 준다.

\x90은 nop sled 기법을 이용한 것이다.

 

코드를 작성하여 주소값을 확인해 준다.

주소 값을 확인해 준후 이를 이용해 cobolt 파일에 바로 패이로드를 작성한다.

\x90은 16바이트의 버퍼 공간과 4바이트의 sfp 공간을 덮기 위해서

bfffff60의 주소는 환경 변수의 주소 이다.

 

코드를 실행하면 쉘이 따진다.

my-pass를 사용해서 비밀번호를 획득하자

'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 - gremlin  (0) 2020.04.10

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