본문 바로가기

전체 글

[NOOBHACK] CBC 암호화 방식 CBC(Cipher Block Chaining) 암호화 방식에 대해 설명할 것은 간단하다. 먼저 준비물은 평문, 암호, 키값과 IV다 여기서 IV란 Initialization Vector의 약자로 암호화가 수행 될 때 마다 랜덤한 값이여야 한다. (키와 같을 경우 키를 알아낼 수 있다) 그리고 IV와 평문을 xor 하여 초기 벡터를 만들어 낸다 평문은 8, 16 바이트 등으로 블록 암호화이기 때문에 암호화의 특정 구현에 따라 크기가 달라진다 (여기선 16바이트를 기준으로 설명하겠습니다) 초기에 만들어야 하는 IV^P1 P1은 처음 평문에서 16바이트를 가져온 것(평문의 1~16바이트) 그리고 이 xor한 값을 암호화 시킨다 예: AES 128 Enc(IV ^ P1) = C1 그리고 처음으로 암호화 된 C.. 더보기
[NOOBHACK] 언더플로우?? 오늘은 언더플로우에 대해 알아보자 오버플로우와 같은 원리로 발생하는 취약점인데 한 변수가 담을 수 있는 수의 크기를 넘어서면 모든 비트가 초기화 되면서 최소값으로 다시 시작하는 것이 오버 플로우의 개념이였다 예시: 0111111 라는 8비트 길이의 숫자가 있다 여기서 첫 번째 비트가 0인것은 음수 양수를 구분하기 위한 비트이다(0은 양수 1은 음수) 그렇기 때문에 이 상태에서 1를 더하면 10000000 이 되면서 음수 양수를 구분하는 비트가 1이 되며 모든 비트가 0이 되어 버린다 근데 음수 비트에는 모든 것이 반대이기 때문에 음수 비트에서 0은 1을 뜻한다 즉, 이 숫자는 실제로 0이 아닌 -128인 것이다!! 그러므로 오버플로우가 일어나면 변수가 담을 수 있는 제일 작은 값 부터 시작한다. 그러면 .. 더보기
[NOOBHACK] 특정 비트를 0 혹은 1로 만드는 코드 오늘 어디어디 수업을 들으면서 강사님에게 한 가지 과제를 받았다. 숫자가 있으면 원하는 위치의 비트를 0으로 만들라는 코드를 짜라고 하셨는데 그 전에 거의 정답에 이론을 설명해 주셨는데 나는 까먹고 기억이 안나서 그냥 내가 생각한 방식으로 만들기로 했다. 먼저 이론적인 방법은 특정 비트를 만들어 바꾸려는 비트와 and 연산을 하면 간단하게 해결이 가능했다 010101 에서 뒤에서 3번째 값을 0으로 바꾸고 싶다면 따로 1로 채운값에 3번째 위치에 0으로 만들고 and를 하면 된다 예시로 111011 이라는 값을 따로 만들어서 and 연산을 하면 1 1 1 0 1 1 - 임의로 만든 비트 0 1 0 1 0 1 - 바꾸려는 bit(AND 연산) 0 1 0 0 0 1 - 결과 값 그럼 반대로 특정 값을 1로 .. 더보기
[NOOBHACK] Fream Pointer Overflow 취약점 (FPO) FPO 취약점이란 감염된 SFP를 통해 쉘 코드나 원하는 주소로 jmp 시키는 공격 기법이다 하지만 이 공격을 하기 위해선 다음과 같은 조건이 충족되어야 한다 1. 최소 SFP에 1byte 이상의 BOF가 발생 2. main 코드에 서브 함수가 실행 되야 함 꽤 까다롭고 공격이론도 어려운지라 off_by_one이라는 취약점 외에 다른 취약점이 발생하지 않는다면 공격하는 방식이다 먼저 off_by_one를 모르는 사람은 이걸 보고 오길 바란다 https://noobhack.tistory.com/62 [NOOBHACK] off by One (OBO), 취약점 #include void copy_buf(char *buf, int sz) { char temp[16]; for(i = 0; i noobhack.tis.. 더보기
[NOOBHACK] 함수 에필로그 오늘은 어셈블리어에서 함수의 끝 작업을 수행하는 에필로그에 대해 알려주겠다 끝 작업은 보통 leave와 ret로 나뉘어 진다 그리고 eip와 esp, ebp 레지스터에 대해 알 필요가 있다 ebp: 변수의 기준의 주소를 담고 있는 레지스터다 보통 데이터를 담고 있는 메모리 주소와 코드를 실행 시킬 수 있는 메모리 주소가 나뉘어져 있는데 주소의 기준을 잡아 줘야 변수의 메모리 주소를 알기 편하다 esp: 스택의 최단 위치를 결정하는 레지스터다 예를 한번 들어보자 그림과 같이 esp가 buf의 끝을 가리킨다면 stack에는 다음과 같이 표현된다 stack에는 buf까지 보여주고 있다 스택의 최상단 지점은 바로 esp가 정한다고 볼 수 있다 eip: 이 레지스터가 가지고 있는 값은 다음에 실행될 코드의 메모리.. 더보기
[NOOBHACK] off by One (OBO), 취약점 #include void copy_buf(char *buf, int sz) { char temp[16]; for(i = 0; i 더보기
[NOOBHACK] Out of Boundary 오늘은 메모리 컬렉션인 Out of Boundary에 대해 됐고 OOB란 버퍼의 길이 범위를 벗어나와 인덱스에 접근할 때 터진다 BOF와 다른 점은 임의로 원하는 인덱스에 접근 한다는 점이다 #include int main() { int win; int idx; int buf[10]; printf("Which index? "); scanf("%d", &idx); printf("Value: "); scanf("%d", &buf[idx]); printf("idx: %d, value: %d\n", idx, buf[idx]); if(win == 31337){ printf("Theori{-----------redacted---------}"); } } 아래와 같은 코드가 있을때 idx를 입력받은 코드에 10 이상.. 더보기
[NOOBHACK] Mster Canary 배울때 보기 좋은거 오늘은 Mster Canary를 배우면서 보기 좋은 것들 모아 놨다 먼저 소스 코드부터 보여주겠다 #include #include 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는 스레.. 더보기