일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Softmax classification
- Linear_regression
- pwnable.kr
- Python
- 인공지능
- AI
- leg
- 텐서플로
- programmers
- logistic regression
- 기능개발
- tensorflow
- Algorithm
- Today
- Total
목록pwnable/LOB (4)
나혼자 공부장

소스 파일을 봤을 때, 알 수 있는 제약 사항은 두가지다. 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 주소에 ..

위 코드를 봤을 때, 이전과 다르지 않아 보이지만 제약사항이 두 가지 추가되었다. 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... 주소에 닿을 때까지 입력값을 극단적으로 늘..

로그인 한 후 현재 디렉토리 정보를 확인하면 cobolt 실행파일의 코드로 보이는 것이 있다. 코드를 확인해봤을 때, 사용자가 입력한 값이 buffer 배열로 들어가므로 , 1. buffer 배열의 시작점부터 RET 직전까지의 byte 수를 구하고 2. 그 byte 수 만큼을 NOP로 채운 다음 3. return address로 쉘이 실행되게 하는 어떠한 주소를 넣어주면 해결되는 맥락이다. cobolt 파일을 gdb로 뜯어보자. 16 (buffer) + 4 (SFP) = 20 Byte 우리가 NOP로 채워야 할 바이트 수가 구해졌다. 이제 3번 사항에 쓰일 쉘이 실행되는 주소를 어떻게 구현해줄 것이냐? 두 가지 방법이 있다. 1. 환경변수를 이용 왜 굳이 환경변수를 이용해야 하느냐 하면, ASLR 이라는..