ssoL2 TISTORY

lob [Level1] gate > gremlin 본문

challenge/pwn

lob [Level1] gate > gremlin

ssoL2 2018. 11. 3. 22:09

안녕하세요 ssoL2 입니다 ~

첫 게시물이라 떨리는 데 LOB 첫 번째 문제 writeup 열심히 작성해보겠습니다 ~~

저는 짱초보 해커라 최대한 이해가 되도록 설명하는 것을 1순위로 두었습니다 ㅎㅎ

그럼 시작하겠습니다 ~~

 

 

 

 

login : gate

password : gate

 

 

 

 

 

 

 

Xshell로 LOB 처음 들어가면 나타나는 화면

 

 

 

 

 

level1은 앞서 말했듯이 gate/gate로 접속

password는 입력받는 걸 안보여주므로 틀리지 않게 조심 !

 

 

 

 

 

ls -al 로 어떤 파일들이 있나 확인해보자

다음 레벨인 gremlin 유저가 만들어 놓은 gremlin파일에 setuid가 있음을 알 수 있다

setuid 유무는 앞에 -rwsr-sr-x에서 s의 유무로 알 수 있다

 

 

 

 

 

gremlin의 소스 코드를 확인해보자

일단 argv error가 나지 않기 위해서 if문에서 argc<2의 조건이 충족되어야 함

즉, argc >= 2 이여야 하므로 인자가 하나 이상 필요하다는 뜻 ( 인자 하나면 argv[0], argv[1]이 발생하기 때문에 )

 

그리고 중요한 것은 strcpy 함수.

strcpy 함수는 문자열 복사하는데, 핵심은널바이트, 즉 |\0을 만날때까지 복사한다는 것임

buffer은 256바이트로 정해져 있지만 argv[1]에 대한 길이 제한이 없으므로

다음 strcpy에서 BOF (buffer over flow) 가 일어날 수 있 수 있음

 

취약점 발견 !

 

자 이제 취약점 발견하고 어떻게 할 것인가 방향을 잡아보자

1. 256바이트 안에 shellcode를 넣고

2. return address에 sheellcode가 실행되도록 가르키는 주소를 넣는거야

 

일단

LOB에서 25바이트 shellcode는 

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

으로 정하자

 

그럼 주소만 알면 된다 > GDB를 사용해서 알아보자

 

 

 

 

 

GDB를 사용할 때는 원본파일이 아닌 사본으로 해야한다

그리고 사본파일 이름 개수를 맞춰주는 게 중요

argv[0]도 메모리 상에 올라오는데, 그 길이가 실제 공격할 때랑 다르면 

우리가 구한 쉘코드 주소랑 약간 달라지기 때문에

똑같이 해주는 거 !!!!!!!

 

이후 gdb 들어가서 intel 어셈블리어로 바꿔주자

 

 

 

 

 

main함수의 어셈블리어를 봐보자

 

<main+54>의 strcpy만 보면 된다

이 위의 인자를 따라가보면 첫번째 인자인 buffer이 ebp-256만큼 임을 알 수 있다

앞서 방향을 정할 때 말했듯이

이 256안에 shellcode를 넣을 거다

 

 

 

 

 

<main+54>에 breakpoint를 걸고

ebp-256부터 "A"를 256개 넣어보자

 

실행 전 esp와 실행 후(ni 명령어 이후) 0xbffff910+8에서부터 A가 담김을 알 수 있다

 

따라서 주소는 0xbffff918이다.

 

 

 

 

 

 

nop을 사용해서 채워주면 정확한 주소를 쓰지 않아도 된다.

nop을 사용하지 않고 "A"를 쓴다면 저 주소 0xbffff918+100을 넣어햐 하지만 nop을 넣음으로써 

편하게 ~ 그냥 주소를 0xbffff918을 썼다.

 

또한, 앞에서 말을 못했는데 이런 과정으로 인해서

0xbffff910을 써도 된다. nop을 쓴다는 가정하에.

 

아무튼  

./gremlin 첫번째 인자에는

python으로 nop 100개로 채우고 shellcode 25개 그리고 또다시 nop 131개로 채워서 총 256바이트를 채웠고,

그 바로 위에 이전 ebp를 "A" 4개로 채워 4바이트를 채우고

return address를 0xbffff918로 채우면 된다.

 

 

my-pass 명령어로 다음 단계 password를 얻으면 되고

 

id 명령어로 현재 성공했는지 못했는지 알 수 있다.

 

 

 

 

 

 

 

그럼 이만..총총 

 

 

'challenge > pwn' 카테고리의 다른 글

pwnable.kr [flag]  (0) 2019.07.09
pwnable.kr [bof]  (0) 2019.07.08
pwnable.kr [collision]  (0) 2019.07.08
pwnable.kr [fd]  (0) 2019.07.08
lob [Level2] gremlin > cobolt (1)  (6) 2018.11.04
Comments