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?