2022. 3. 13. 15:17ㆍSite/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 |