지옥방 3주차 과제 LOB 2,3번 뿌시기
LOB https://www.hackerschool.org/HS_Boards/zboard.php?id=HS_Notice&no=1170881885
정신적 지주 https://ls-toast.tistory.com/
1번,,두둥
로그인할때 id와 password가 gate / gate라고 해서 id를 치고 password를 치는데
아무것도 안쳐지는거에요!!! 그래서 와씨 LOB 삭제했다가~ 다시 깔고~ 막 다 했는데 똑같길래 그냥 gate치고 엔터치니깐 되네요??
( password 칸은 노출을 막기 위해서 안보이게 한다...메모.....)
ls를 입력해서 무슨 파일이 있나 보니깐 gremlin과 gremlin.c가 있다.
삭님의 추천은 .c파일을 보지 않고 gdb를 이용해서 바이너리 분석을 하고! 익스플로잇을 하는 방법이였당
짱짱해커가 되려면 어려운 길을 걸어야지!
바로 gdb로 gremlin 실행파일을 연다,,,
와우,, 뭔가 흠,, 수능 이후로 영어를 읽어본 적은 없지만 해석해보면
안돼
이라고 해석된다.
구글링을 해보니 실행파일을 cp 명령어를 사용해 tmp 폴더로 복사하고 그걸 gdb로 여는 방법이 있다!!!!!( cp 옮길파일 목적지)
권한이 없어서 그렇다고 한당
바로 아래처럼 말이다.
cp로 복사한뒤 run 시킨다!
disass main
을 이용해 어셈블리어로 이루어진 gremlin을 본다. 놀란다. 후회한다. 왜 그랬지. 그냥 c파일로 볼걸. 훟. 핳.
자 하나하나 분석해봅시다
근데 여기서 문제가 발생한다. 제출기한이 6시간 34분이 남은 지금, 나는 자서전도 써서 내야한다. 그렇기에!!!!
도망간다
간단한 코드다. 256 바이트 크기의 buffer를 선언하고 argc가 2보다 작다면 "argv error"를 출력하고 프로그램을 종료한다.
argc가 2 이상이라면 문자열 복사하고~ 그걸 출력한다~
여기서 argc와 argv가 뭐냐!! 지금부터 설명 들어갑니다잉(쿵짞짞 쿵짞짞)
gremlin을 실행할때 ./gremlin asdf 라고 입력을 하면 argc는 2, argv[1]에는 "asdf"가 들어간다.(argv[0]에는 "./gremlin" )
./gremlin 만 입력하면 argc는 1, argv에는 아무것도 들어가지 않는다. 차이가..보이는가!?
argc는 쪼기 몇 단어(?) 쓰였나이고 argv는 함께 입력한 값이 들어가는 곳이지용
취약점은 저 strcpy에 있다. strcpy 함수는 문자열을 복사해줄때 길이를 보지 않는다. 입력받은 데이터는 모두 집어넣는 것이다.
그렇기에 256 글자가 넘는 문자열을 입력해도 buffer의 영역을 넘어선 다른 영역까지 데이터가 덮어씌워지는 것이다!!
그럼 취약점도 알았으니 gdb로 다시 어셈블리어 코드를 보면
여기서 문제가 발생하는 바로 그곳! call strcpy 저 부분!!
그곳에 break point 를 걸어준다
주소값이 아닌 b *main+54를 사용해도 되지만 이게 더 깐지 나서 이 방법을 선택했다. 그리고 실행하면?
설정한 break point에 타아악 걸렸다
breakpoint를 call strcpy로 지정했기에 strcpy를 진행하려면 ni 를 이용한다.(다음 명령어 진행하라)
위에서 사용된 x/x 명령어는 메모리의 내용을 16진수로 출력하라는 명령어이다. 뒤 x의 앞에 붙여준 숫자는 출력할 사이즈를 의미한다.
x/20x $esp로 esp의 상황을 보면? 저기 아름다운 414141414141414144141414141이 실행할때 같이 입력한 AAAAAAA가 된다.
이를 이용해 bof로 딱!? return address에 쉘코드 주소 딱 넣으면?어!? 그럼 쉘이 켜지면서? 그건 그 실행파일의 사용자의 권한으로 켜지고?
이와 같이 gremlin 실행파일은 우리의 목표인 gremlin으로 되어있으니깐? 후 짱짱해커
그럼 총 몇바이트를 덮어 써야하는지 계산을 해보자구요!!
근데 여러분,,그거 아시나요?
1번은 푸는거 아니래여 후힣 푸핳 푸흐흐하ㅏ하하하하하하ㅏㅎ하ㅏ하 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
어이가 없죠? 저두요!!
이거 몇시간 한건데 후힣 풓ㅎ 푸흐하하하하하하하ㅏ하하하
빠르게 2번으로 넘어간다.
2번
흠 뭘까
gremlin으로 로그인을 한 후 뭐가 있나 봤다. 이번 역시 시간이 없으니 C 파일을 먼저 보자
16바이트의 버퍼를 선언하고 뭐지
똑같다
1번이랑 크기만 달라진거 같은뒈 뭐지이
기능도 똑같고오오 뭐지
진짜 제목 그대로 버퍼 크기만 작은 버전인건가
자신감이 생긴다
시작해보자!
call strcpy에 bp 1을 정해주고 실행을 했는데 아까 1번에서와 같이 권한 문제가 발생한다.
또다시 tmp 폴더로 복사해 이 문제를 해결하고 다시 실행한다
이제 이 친구와 함께 새벽을 함께 보내보겠다
어디에 있을까 내가 넣은 AAAAAAAAAAAA,,, 아 맞다 ni 해줘야지!
아니 미친놈인가
실행할때 r /tmp/cobolt를 했네,,,
다시 후 r AAAAAAAAAAAA를 해주고 ni를 해주자!
지금의 스택 구조를 살펴보면
argv |
main 함수의 인자값으로 주어진 argc와 argc는 주어진 데이터의 크기만큼 할당해 저장되어 있음 |
argc | |
RET | 우리가 조작해야 하는 친구ㅎㅎ 0xbffffb2c에 저장되어 있다. |
EBP | 0xbffffb28에 저장되어 있다 |
... | ... |
esp | 0xbffffb10 |
일단 쉘코드가 저장될 첫 주소값은 0x41414141이 저장되어 있는 곳이니 $esp+8이 된다.
그럼 이 주소부터 데이터를 채운다고 했을때 얼마만큼의 데이터를 넣어야 ebp까지 덮어씌워지나 계산을 해봅시당
ebp의 첫 주소값에서 esp+8을 빼주면 얼마만큼의 데이터를 넣어야하는지 딱 나온다
정확히 0x10, 즉 16바이트가 차이난다. 근데 16바이트는 가지고 있는 쉘코드를 넣기에 너무 작은 크기이다.
이게 아까 1번과의 차이점인거 같다!!!!!
해결법을 구글에서 얻었지요옹
환.경.변.수.
환경변수를 등록하는 방법은 export [환경변수이름]이다.
export Shell=쉘코드와 같이 작성해주고 리턴 어드레스에 환경변수의 주소값을 작성해주면 뭐 난리난다.
위와 같은 C파일을 만들고 이를 gcc를 이용하여 컴파일한 후 실행하면 SHELLCODE라는 이름의 환경변수의 주소값을 알아낼 수 있다.
인터넷에서 얻은 쉘코드를 SELLCODE라는 이름의 환경변수에 넣어준 후 위에서 만든 hack.c로 그 환경변수의 주소값을 찾아냈다.
그 값은 0xbffffd66이다.
후 그럼 이제 마지막 생각해보자
넣어야하는 데이터는 buf의 16바이트 + EBP 4바이트 + 환경변수의 주소값이다.
그럼 a*20 + "\x66\xfd\xff\xbf" 를 넣으면 딱 끝
./cobolt 'perl -e 'print "a"*20+"\x66\xfd\xff\xbf"''를 입력해보겠다
하씨 이 vmware 나쁜시키가 계속 커맨드키 누르면 LOB가 초기화되서 스샷을 못찍었지만,,하면 my-pass를 입력하였을때 비밀번호가 나온다.
id는 cobolt 비밀번호는 hacking exposed다!
너를 부수러 왔다
덤벼라..!
방금 했던 small buffer와 stdin을 이용!! goblin 계정을 탈취하면 된다.
이 프로그램의 취약점은 gets다. gets도 지금까지 다뤄왔던 함수들과 같이 데이터를 받는 변수의 크기를 고려하지 않고 사용자가 입력하는대로 때려박는다. 2번 문제와 다른 점은 프로그램 실행 후에 입력을 받는다는 것!
스택 구조는 저번과 같을 것이다
esp의 주소는 0xbffffb48
이번에 사용할 쉘 코드는!? 두구두구두구두구
아까와 같이 환경변수의 주소값을 출력하는 hack.c를 gcc로 컴파일해주고 실행해서 환경변수 SHELLCODE의 주소값이 0xbffffe88임을 알았다.
2단계와 같이 페이로드 설계는 의미 없는 값 20바이트와 환경변수 SHELLCODE의 주소를 합치면 완벽하다.
dummy 20bytes + "\x88\xfe\xff\xbf"이 될 것이다.
그.런.데.
이는 cobolt를 풀때와 똑같이 저렇게 줘버리면 권한 탈취가 되지 않는다. 그 이유는 프로그램이 실행되고 나서 입력으로 전달해야하기 때문이다.
이때 사용하는 것이 바로 파이프(|)
파이프를 사용하는 이유는 하나의 커맨드를 다른 커맨드의 입력이나 출력으로 지정할 수 있기 때문! 즉, 여러명령을 하나의 커맨드라인 안에서 처리가 가능하다.
또한,,, 파이프라인 기호 " | "의 왼쪽 명령의 표준 출력(stdout)을 오른쪽 명령의 표준입력(stdin)으로 사용가능하다.
이게이게 바로 지금 필요한거자나요~~
쉘코드가 저장된 환경변수로 이동하라는 명령을 출력하는 코드 | goblin 실행이럼 뭐 끝장 나는거지~
흐음 왜지
이것은 백퍼센또 쉘코드의 잘못이다.
다른 쉘코드를 찾아보자
https://duwjdtn11.tistory.com/126
이 블로그의 쉘코드를 참고했더니,,,후힣
댓글
이 글 공유하기
다른 글
-
<2/2> 지옥방 4주차 과제[orge-skeleton 다 뿌시기]
<2/2> 지옥방 4주차 과제[orge-skeleton 다 뿌시기]
2020.05.11 -
<1/2> 지옥방 4주차 과제[goblin-darkelf 다 뿌시기]
<1/2> 지옥방 4주차 과제[goblin-darkelf 다 뿌시기]
2020.04.30 -
지옥방 포너블 3주차 과제 모음!
지옥방 포너블 3주차 과제 모음!
2020.04.24 -
지옥방 3주차 과제 라젠카 뿌시기(NX Bit)
지옥방 3주차 과제 라젠카 뿌시기(NX Bit)
2020.04.24