일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 네트워크 보안
- 생활코딩
- 윈도우 프로세스 종류
- 네트워크관리사2급
- slack space
- 디지털포렌식 with CTF
- html
- 2022시작
- blkls
- memory
- 포렌식
- 는 하지마...
- 실기
- disk
- Multimedia
- 디지털포렌식
- pythonchallenge
- Multimeida
- vinetto
- network
- 슬퍼유
- 윈도우 프로세스
- ZIP 파일구조
- 정보처리기사 필기 합격
- 생활코딩 html
- ftz
- Window process
- 24시간의 전사
- N0Named
- CTF-D
- Today
- Total
ssoL2 TISTORY
lob [Level1] gate > gremlin 본문
안녕하세요 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 |