Transcript fsb
FSB 숭실대학교 ACK 박수완(LinkC) [email protected] What is FSB? • FSB(Format String Bug) 버퍼오버플로우와 함께 대표적인 시스템 해킹으로 꼽히는 기술 버퍼오버플로우가 나온지 20여년 후에 기술 발견 포맷스트링의 버그를 이용해 메모리를 변조하는 기술 • Format String? ex) printf(“%s\n”,Welcome ACK!”); • C언어의 변환 명세를 의미 Kind of Format String 파라미터 변수형식 %d 정수형 10진수 상수 %f 실수형 상수 %c 문자 값 %s 문자 스트링 %x 양의 정수(16진수) %n 쓰인 총 바이트 수를 지정할 정수형 포인터 Format String : %n을 이용한 변조 %n을 사용했을 뿐인데 i와 j의 값이 변했음을 알 수 있다. %n 과 대응하는 주소의 실제 값이 변했다. 변환 값은 앞에 쓰인 총 바이 트에 해당한다. 즉 %n은 자신과 대응하는 값에 앞서 쓰인 총 바이트 의 정수값을 넣는다는 것 을 짐작할 수 있다. A vulnerable code 배열 buf를 선언하고 사용자에게 값을 입력받은 후 출력하는 간단한 프로그램 ▲Vulnerable code ▲invulnerable code What is the problem? 첫번째 결과는 아무 이상이 없어 보이지만 %x 라는 Format String 을 사용하자 42130a14 라는 알 수 없는 8자리 숫자가 나타남을 알 수 있다. AAAA <-%x 0x8048269 <-%x 0xbfffd5f8 <-%x 0x42130a14 <-%x Q.단순히 쓰레기 값 일까? A의 아스키 코드는 41 임을 주목하자 4번째 명세부터 사용 자가 입력한 값을 가 What is the key? 취약한 Printf() 로 사용자가 입력한 값에 접 근할 수 있다. %n으로 특정 주소의 값을 변경할 수 있다. 즉, printf와 %n을 함께 이용하면 사용자가 입력한 특정 주소의 값을 변경 할 수 있다 메모리 변조 시도 #1 Printf 함수내용을 cat으로 읽어 그 출 력결과를 | (pipe) 를 통해 level20의 입력값으로 넘겨준다. 메모리 변조 시도 #2 ◆%를 두번써준 이유는 cat 을 지나며 하나가 사라지기 때문 ◆0xbffffb20에 값을 넣어주는데 2byte씩 작은 값부터 넣어주는 이유는 메모리 적재 방식이 Little endian 이기 때문 Q. 메모리 상에 정확히 기입이 됐는데 변조는 일 어나지 않았다. 메모리 변조 시도 #3 4번째 Format String 부터 입력값을 받았다는 것을 기억하라. 특정 메모리 값의 변조에 성공했다. Q. 왜 22byte가 들어간건가? 메모리 변조 시도 #4 Q. 왜 22byte가 들어간건가? 4byte+??+??+??=22byte 4byte + 2 byte + 8byte + 8byte= 22byte! FSB는 1이라도 값이 달라지면 실패하는 정교 한 공격이기 때문에 정확한 값을 위해서 x의 최대 자리수 8을 앞에 붙여주자. Hacker School FTZ level20 Setreuid:권한 상승 Fgets : 사용자에게 79자 입력을 받는다. BOF는 불가! BOF:buffer를 overflow시켜서 메모 리를 변조시키는 방법 Printf : FSB 의 단 서 How to FSB? EGG Shell을 실행시켜 환경변수에 Shell code 를 삽입한다. 환경변수 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 , 동적인 값들의 모임 Shell code 쉘에서 사용하는 기계어 코드를 의미 Setuid로 권한상승후에 쉘(/bin/sh)을 실행시키는 코드 적재 Setuid:파일에 걸리는 일종의 속성으로 실행시키는 동안 파일 소유자의 권한을 가지게 된다. 이는 많은 공격의 target이 되 How to FSB?#2 파일이 동작하면서 실행하는 포인터에 EGG Shell로 등록한 코드의 주소를 집어 넣는다. RET(Return Address) :함수가 끝나고 실행할 주소 가 담겨있는 포인터 파일이 실행되면 Setuid 로 권한 상승이 일어 나고 EGG Shell로 삽입한 코드가 실행되면서 파일 소유자의 권한의 쉘을 얻는다. What is the EGG shell? egg·shell n. 달걀 껍질;깨지기 쉬운 것 ━ a. 얇고 부서지기 쉬 운 특정 환경 변수(EGG)에 사용자가 입력한 shellcode 를 등록시켜 주 고 그 주소를 출력 시켜주는 프로 그램 Shell code 의 의미? 메모리에 /bin/sh라는 문자열 을 위치 시키고 이를 실행시키 는 code로 이루어져있다. Real FSB#1 -EGG Shell, getenv 실행 ▲환경변수를 확인하는 명령어 env로 등록된 EGG의 확인 ◀EGG쉘의 주소를 정확히 알기 위해 getenv 실행 Real FSB#2 RET의 검색 Objdump 명령어를 이용해서 level20 이 실행시 호출되 는 것들을 확인해 보자. Objdump: object file 에 대한 여러 가지 정보 출력 Object file: 컴파 일 도중 만들어지는 파일로 여러가지 정 보를 포함 이중에서 이용 할 것은 main 종료시 실행되 Real FSB#3 Exploit code! EGG 쉘의 주소를 .dtors 의 두번째 영역에서 +4 한 값에 넣어주면 된다. .dtors 두번째 영역에 값을 넣어줄경우 프로그램이 정상 종료되 지 않아 공격이 성공하지 않는다. Dtors 영역 0x08049594에 EGG의 주소0xbfffff1c9를 집어 넣는다. Bffff1c9 의 정수값은 3221221833 0x08049504 <-%n AAAA <-%8x ?? <-%8x ?? <-%8x ?? <-%8x ▲각 변환 명세가 가리키는 스택 Real FSB#4 Exploit code! Q. 프로그램이 도중에 끝나버린다. 어디가 잘못된것일 까? 3221221833은 너무 큰수라 인식할 수 없다. 그렇다면 2byte씩 나눠 넣는것은 어떨까? 그러니까 처음 2byte는 0xbfffff1c9 중 f1c9를 다음 2byte 는 bfff 를 넣는다. F1c9 의 정수값은 61897 이고 앞서 쓴 주소 값과 문자열값 40을 빼면 61857 – 문자열값 40: 4(aaaa)+4(bbbb)+8(%8x)x3+4(주소값)x2 bfff를 넣어줘야 하는데 스택에서 bf로 시작하는 주소값은 ‘-’를 의미한다. 양수의 경우는 이와 구분짓기 위해 앞에 1을 생략한다. 고로 bfff의 실제 값은 1bfff인셈 1bfff은 114687이고 앞서 61857+40자가 쓰였으므로 이를 빼 주면 52790 이 된다. Real FSB#5 Exploit code! 즉, 0x08049594~0x08049595에는 f1c9를 넣어주고 0x08049596~0x08049597에는 1bfff를 넣어주면 0x08049594부터 4바이트는 bffff1c9 값을 가지게 된 다. 0x08049596 <-%n= 114687=1bfff BBBB 0x08049594 <-%52790c <-%n= 61897=f1c9 AAAA <-%61857c ??? <-%x ??? <-%x ??? <-%x Real FSB#5 Exploit code! 고로 최종 코드는.. 이고 이를 실행시키면 #final Thank you :) Do you have any question?