Level13 풀이.
pw = 'have no clue'
일단 문제 접근을 위해 hint를 본다.
C코드가 등장했고, 좀 새로운 개념들이 나왔으니, 분석해보겠다.
1번째 long I = 0x1234567; = long 타입의 변수 I를 선언하고, 0x1234567 값으로 초기화 시킨다.
2번째 char buf[1024]; = buf라는 이름의 1024 크기를 가진 배열 선언.
3번째 setreuid( 3094, 3094 ); level 12에서 봤던 다음 레벨의 권한 같다.
4번째 if(argc>1) strcpy(buf, argv[1]); = 프로그램이 실행되면, 인자 값을 buf[1024]에 복사.
5번째 if(i != 0x1234567)l, printf ~~~는, kill ~~는 값이 0x1234567 인지 확인하는 부분.
0x12345567이 아니라면 메시지를 출력하고 kill 함수 실행.
kill(0,11)에서 0은 프로세스 아이디를 말하고 11은 시그널 번호 의미.
참고로 strcpy가 나왔는데, 이 함수는 복사할 때 크기를 체크안하기에 버퍼 오버 플로우 발생.
일단 0x418만큼 할당되었고, 0x418을 10진수로 하면 1048. 즉 buf는 1024를 차지하는데 24만큼의 공간이 더 할당된 것.
cf) 스택 가드 ==============================
스택 가드는 인자를 입력할 때 입력 내용을 지정하는 배열(buf)와 ret 주소 사이에 스택 가드라는 공간이 만들어져 있다. 이 문제에서는 스택 가드가 long I.
파일을 버퍼 오버플로우시키면 ret 주소가 변조되는데 스택 가드도 해당.
스택 가드가 변조되었다는 것은 버퍼 오버 플로우 공격이 일어났다는 것을 의미, 스택 가드가 변조된 걸 if문으로 확인 => 실행 차단해서 공격 방어.
I의 값을 ebp 끝 주소에서 4byte 앞 주소에 대입. 24중 4는 I가 차지하는 것.
if 문으로 breakpoint 잡고, 임의로 채울 값으로 A를 정해준다.
x/264x $esp는 esp 주소에서 264개를 16진수로 출력.
0xbffff4b0 주소에서 첫 번째와 두 번째가 0x41414141fh = 아까 임의의 값 AAAAAAAA.
gdb로 실행.
스택 가드는 0xbffff8b0 메모리 주소에 위치.
참고로 AAAA 문자열 정보.
스택 가드가 있던 곳인데 모두 다 AAAA.
이렇게 하면 스택 가드가 변조되서 BOF 에러 메시를 띄우며, kill함수 때문에 segmentation fault가 발생.
스택 가드에 있던 값인 0x01234567를 변조하지 않고, 넘어가서 RET 주소를 0x01234567로 변조한 걸 확인 가능.
쉘 코드 작성.
export 함수로 쉘 코드를 올린다.
이제 attackme에 입력.
pw는 "what that nigga want?"
cf)..
python 공격문은 buf(1024) + dummy(12) = 1036만큼 A로 할당하고, 그 뒤에 올 스택 가드를 뚫기 위해 0x01234567 넣어주고, dummy(8) + SFP(4) = 12만큼을 A로 덮어써주면 RET주소가 오게 되는데 그 주소를 쉘 코드의 주소로 덮어씌운 것.
cf2) 점점 문제 풀이가 길어진다. 복습 잘해야겠다...