FTZ level20

2022. 3. 13. 15:17Site/FTZ

이번시간에는 level20에 대하여 풀어보겠습니다

공부를 하는 입장이니 틀린게 있어도 양해부탁드리겠습니다


전체 디렉토리와 파일목록을 확인하니 attackme가 있습니다

힌트파일을 열어주었더닌 소스코드를 확인했습니다

*

chat형 blesh배열 20bytes할당

setreuid = level 20 id

fgets함수로 79bytes의 입력값을 bleh에 할당

printf로 bleh 출력

*

 

여기서 이상한점이 bleh버퍼가 80bytes로 선언이 되어있는데 입력을 79bytes 제한을 해버려서 버퍼오버플로우로 이용해서 ret까지 덮어 쓸 수 없을 것 같습니다...

하지만 printf(bleh)부분에서 포맷스트링버그가 발생한다고 합니다

 

* 포맷스트링버그 : 검사되지않은 사용자입력을 포맷스트링으로 입력하여 %s 나%x포맷스트링을 이용해서 다른 데이터의 위치를 볼 수 있는 취약점

보통은 printf("%d", a)처럼 변수앞에서 서식문자로 작성하는것이 일반적...

위 처럼 print(bleh)같이 문자열 자체를 출력하는데에는 문제없음 하지만 서식문자가 들어갈경우 문제발생됨. [printf가 문자열로 보지않고 서식문자로인식하기 때문] -> 서식문자를 만나면 스택을 4bytes씩 높이며 해당주소값을 출력하는 취약점 발생

cf) 포맷스트링 종류 

%d[정수형10진수상수], %f[실수형상수], %c[문자값], %s[문자스트링], %x[앙의정수(16진수)], %n[앞까지의 출력된자릿수계산 -> 다음스택을 주소로여기고 계산한자릿수입력]

*

%n이 중요하네요. AAA%n을 하게되면 앞에까지 출력된 A3개가 있고 %n은 다음주소값에 3을 전달합니다

아마도 앞에 오는 자리에 따라  원하는주소에 접근하여 내용을 변경할수 있을 것 같습니다

attackme를 실행시켜 AAAA %8x %8x %8x %8x를 입력했습니다

AAAA를 출력하고 12bytes 이동하고 4번째 부분에 41[A]이라는 bleh의 시작주소부분이 보입니다 [1,2,3번째 %x는

dummy?(24bytes)]

 

ret주소를 알기위해 disas main에 접근했는데 심볼이 없다고 나와서 접근을 못할 것 같습니다

그럼 ret말고 다른 것을 건드려야 하는데 구글링을 해보니 .dtors의 주소값을 건들면 된다고 합니다(구글링참조)

 

*

GNU 컴파일러로 컴파일된 프로그램은 .dtors[소멸자], .ctors[생성자]를 생성함

.ctors = main()이 실행되기 전에 호출됨

.dtors = main()이 종료되기 직전에 호출됨

*

main함수가 종료되고 .dtors를 불러와서 주소값을 쉘코드로 덮어씌우는 방법으로 접근해야됩니다 [.dtors의 주소 = .dtors섹션 + 4bytes]

 

objump명령어를 통해 .dtors의 주소값 확인을 했습니다[.dotors의 주소 = 08049594 + 4 = 08049598]

cf) objdump-h[섹션헤더확인] / objdump -s[section별로 나누어 요청, 모든내용을 보여줌] / objdump -S[디스어셈플한소스전체보여줌] / objdump-D[전부디버깅] / objdump-d[디스어셈블]

 

환경변수에 쉘코드를 등록시켜주고 getenv를 통해 쉘코드의 주소값을 얻어왔습니다

주소값이 0xbffffbc8이네요...

페이로드를 작성할건데 %n을 이용해야 작성해야되므로 위 주소값을 10진수로 변경해야합니다[%n은자릿수를10진수로넣음]

근데 10진수로 값이 3,221,224,392정도 되지만 x86시스템에서는 저정도의 크기를 받을수 없으므로 반으로 나누어서 넣어줘야될 것 같습니다...

리틀 인디언식으로 들어가니 fbc8과 bfff순으로 나누어주면 될 것 같습니다

fbc8은 .dtors[08049598]에 넣고 bfff는 2bytes 떨어진 [0804959a]에 넣어주면될것같습니다

fbc8은 10진수로 64456 하지만 앞서서 보았던 AAAA[4bytes]+.dtors[4bytes]+AAAA[4bytes]+.dtors위치+2bytes[4bytes] +8bytes*3 = 40bytes이므로 40을 빼주어 64416으로 작성합니다

bfff는 10진수로 49151인데 fbc8과 빼주면 음수가 되므로 1을 붙여서 1bfff[114687]만든뒤 -64416을해준 50231을 넣어줍니다

 

쉬운문제하나없어서 다시 차근차근 복습해봐야될것같습니다

'Site > FTZ' 카테고리의 다른 글

FTZ level19  (0) 2022.03.10
FTZ level18  (0) 2022.03.10
FTZ level17  (0) 2022.03.09
FTZ level16  (0) 2022.03.09
FTZ level15  (0) 2022.03.09