오늘은 Mster Canary를 배우면서 보기 좋은 것들 모아 놨다 먼저
소스 코드부터 보여주겠다
#include <stdio.h>
#include <unistd.h>
int main(){
char buf[256];
read(0,buf,1000);
printf("%s", buf);
}
알아서 준비 하시고
gcc 명령어는 이거다
gcc -fstack-protector -w -o canary canary.c
알아서 타자 치시고
아무 곳이나 브레이크 포인트 걸어준다
디버깅 해서 먼저 카나리의 값을 살펴보자
먼저 TLS에 대해 알아야 할 필요가 있으니 아래꺼나 보고 오거나 알면 계속 보자
https://noobhack.tistory.com/59
[NOOBHACK] Thread Local Storage이란
Thread Local Storage는 스레드의 저장 공간을 의미하지만 ELF 파일들을 살펴보면 각각의 목적을 가진 섹션에서 데이터를 관리하며 코드를 실행하기 위한 .text나 초기화 되지 않은 전연 변수를 위한 .da
noobhack.tistory.com
그래서 런을 걸어주며 아래와 같은 명령어를 쳐보자
x/x란 메모리 주소의 값과 주소를 확인 할 수 있는 명령어 이며 $fs_base는 FS 세그먼트 레지스터를 가리키는 레지스터니까 해석하자면 $fs_base+0x28 주소의 값을 확인하라는데
그게 Mster Canary 라는 즉 마지막에 확인할 <__stack_chk_fail@plt> 함수에서 비교할 원본 데이터 라는 의미다 즉 이 메모리가 바뀌면 비교할 값도 바뀐다는 소리다
참고로 Canary는 TLS으로 부터 0x28 떨어진 곳에서 생성 된다
이제 계속 실행 시켜 read 함수에 내려와 데이터를 써주자
나는 buf를 꽉 채우기 위해 256개의 A를 쓰겠따
이제 이 메모리 구조를 설명하겠다
먼저
이 0x41은 우리가 입력한 A이며 256 끝자락의 16개의 문자만 보여주고 있는 상태다
여기 있는 널바이트들은 데이터를 떼어놓기 위함이며 printf는 널 바이트가 나올 때 까지 계속 출력하기 때문에 이게 다른 값이면 카나리가 노출 된다 참고로 0x0a는 엔터 값이며 사실은 0x00이다 read 함수는 엔터까지 전부 입력 받지만 scanf는 엔터 값을 받지 않고 입력이 끝난다
이제 0x00 0x10 0x15 0xd7 0x4d 0x6b 0xcf 0xd0 가 바로 Canary다 BOF를 막기 위해서 나온 메모리 값이다
첫번째 데이터는 무조건 NULL 바이트이며 나머지 7byte는 전부 랜덤한 값이다 나중에 카나리가 오염 됐는지 확인할 때에는 NULL바이트를 포함한 8byte를 전부 검사한다
이제 카나리 우회 기법중 하나인 카나리 유출을 한번 해보자
하는 원리는 내가 위에서 다 설명 했다
다음에 2편 올리겠다
'CTF 풀이' 카테고리의 다른 글
[NOOBHACK] dreamhack LV.3 chocoshop 문제 풀이 (0) | 2023.01.06 |
---|---|
[NOOBHACK] webhacking.kr 8번 (0) | 2022.12.20 |
[NOOBHACK] DefCoN#21 #1 풀이 (0) | 2022.09.26 |
[NOOBHACK] Webhacking.kr 5번 (4) | 2022.09.21 |