일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- tensorflow
- 기능개발
- Python
- Algorithm
- leg
- Softmax classification
- 텐서플로
- Linear_regression
- programmers
- logistic regression
- AI
- 인공지능
- pwnable.kr
- Today
- Total
목록전체 글 (71)
나혼자 공부장
Chapter 13에서 공부한 내용의 확장 1. Point 클래스 템플릿과 배열 클래스 템플릿 만약 클래스 템플릿을 기반으로 템플릿 클래스의 객체를 저장해야 하는 경우도 있을 것이다. 아래와 같이 선언한다. BoundCheckArray oarr(50); BoundCheckArray oparr(50); /*** typedef 선언 사용 ***/ typedef Point* POINT_PTR; BoundCheckArray oparr(50); 2. 특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와 friend 선언 /*** 특정 템플릿 클래스에 한정해서 멤버 함수 선언 ***/ #include using namespace std; template class Point { private: T xpos, ..
#include using namespace std; class Point { private: int xpos, ypos; public: Point(int x = 0, int y = 0) : xpos(x), ypos(y) {} void SetPos(int x, int y) { xpos = x; ypos = y; } void ShowPosition() const { cout
템플릿에 대한 이해와 함수 템플릿 함수 템플릿 : 함수를 만드는 도구 함수 템플릿은 다양한 자료형의 함수를 만들어낼 수 있다. 함수의 기능은 정해져있고, 용도에 따라 달라지는 자료형을 결정하기 위한 템플릿이라고 이해하면 된다. 아래와 같이 정의한다. template //template 와 같은 의미 T add(T num1, T num2){ return num1+num2; } 예제 1. /* 덧셈 템플릿 구현 및 사용 */ #include using namespace std; template T Add (T num1, T num2){ return num1+num2; } int main(void) { cout
1. 포인터와 참조자를 구별하자 포인터는 null 가리키는게 되는데 참조자는 안 됨. 무조건 객체를 가리켜야 한다 포인터 - 다른 객체 참조할 수 있음 참조자 - 초기화할 때 참조했던 그 객체만 참조 가능 operator[] 을 사용해야 할 때 참조자로 반환하도록 하는게 보통 2. 가능한 C++ 스타일의 캐스트를 즐겨 쓰자 캐스트는 형변환이라는 뜻 C스타일 캐스트의 문제점 - 아무 생각이 없다 - 눈으로 찾아내기가 힘들다 .. 소스코드 안에서 괄호 쓰는게 한두개가 아니기 때문 아래는 cast 연산자 예시 중 하나고 C언어 : double result = ((double) firstNumber) / secondNumber C++ : double result = static_cast (firstNumber)..
보호되어 있는 글입니다.
이전에 작성했던 int_ignore() 함수를 구현할 것이다. 전 회차에서 말했듯 int_ignore() 는 말 그대로 무시할 수 있는 인터럽트들이 가리키는 함수이다. 256 개의 IDT 테이블을 하나하나 전부 다르게 하기에는 무리가 있으므로 당장은 이 함수를 쓴다. void idt_ignore() { __asm__ __volatile__ ( "push gs;" "push fs;" "push es;" "push ds;" "pushad;" "pushfd;" "mov al, 0x20;" //PIC 하드웨어 재세팅 "out 0x20, al;" ); kprintf("idt_ignore", 5, 40); __asm__ __volatile__ ( "popfd;" "popad;" "pop ds;" "pop es;" ..
소스 파일을 봤을 때, 알 수 있는 제약 사항은 두가지다. 1. strcpy 함수 주소로 리턴을 받아야 하고 2. strcpy 함수 이후 공간에는 AAAA 를 넣을 것이니 리턴받을 strcpy 함수를 이용해 뭔가 익스플로잇을 해야한다. 일단 스택은 이렇게 생겼을 것이다. 제약사항들을 고려해서 시나리오를 구상해보자. 1. buffer+sfp의 44바이트를 system("/bin/sh") 공간으로 채우고 2. strcpy로 리턴을 받은 후 3. strcpy의 인자로는 destination은 RET+4, source는 &buffer로 전달해준다면 4. strcpy가 실행되면서 AAAA의 공간을 buffer의 주소로 채워주기 때문에 5. strcpy 종료 후 buffer 주소로 RET 6. buffer 주소에 ..
PLT (Procedure Linkage Table) : 외부 함수들을 연결해주는 테이블 GOT (Global Offset Table) : 실제 함수들의 주소를 담고 있는 테이블. PLT가 참조하는 테이블 Dynamic Link의 경우, 컴파일 시 외부 라이브러리와 링킹하기 때문에, static 방식과 달리 주소를 가져오는 과정이 따로 필요하다. 이 때 쓰는게 PLT와 GOT다. 함수 호출 시 PLT와 GOT가 동작하는 과정을 순서도 형식으로 나타내보았다.
위 코드를 봤을 때, 이전과 다르지 않아 보이지만 제약사항이 두 가지 추가되었다. 1. 환경변수를 초기화하는 과정이 추가되어 환경변수를 이용한 공격이 불가능해졌다. 2. buffer를 모두 0으로 만들어버리기 때문에 buffer에 쉘코드를 넣는 방식의 공격이 불가능해졌다. 즉, 환경변수를 이용하지 않고 return으로 buffer가 아니면서 bf로 시작하는 주소에 저장되어있는 쉘코드를 실행시키라는 소리이다. buffer를 0으로 만들더라도, 쉘코드는 어차피 버퍼 너머에서 동작할 것이기 때문에 영향을 받지 않는다. 공격 시 스택구조는 위와 같게 된다. .... 라고 표현한 부분은 리턴 주소가 bf 로 시작해야하기 때문에, 주소를 맞추기 위해 스택의 크기를 bf가 로 시작하는 주소에 닿을 때까지 늘려주는 것..
공격파일 코드이다. 위 코드만 봤을 때 알 수 있는 제약사항은 한 가지다. argv 인자의 47번째 값은 bf이되, 46번째 값은 ff이면 안 된다는 것이다. 이제는 딱히 gdb를 뜯어보지 않고도 스택을 그릴 수 있다. argv를 48byte 만큼 받으면, buffer로 strcpy 되었을 때 48번째 위치가 결과적으로 리턴 주소이기 때문에 argv의 44~47 번째 값이 곧 리턴 주소이다. 그 리턴 주소에 쉘코드가 있도록 구상할건데, 그 주소는 0xbffe.... 로 시작하도록 할 것이다. 더 주소를 높여서 조건문들을 우회하는 방법도 있으나 커널 영역을 침범할 가능성이 있기 때문에 주소를 낮춰서 우회하는 것이 낫다. 스택의 크기는 가변적이다. 0xbffe... 주소에 닿을 때까지 입력값을 극단적으로 늘..