목록system hacking (69)
ii4gsp
주석을 보면 RTL2라고 되어있다 RTL기법을 사용해야한다. argv[1][44]에 입력된 값이 execve()함수의 주소와 같아야한다. 라이브러리의 주소를 구해주자 파일을 복사해주고 gdb로 열어 print명령어로 각 라이브러리의 주소를 구해주었다. system()함수 주소 0x40058ae0 execve()함수 주소 0x400a9d48 exit()함수 주소 0x400391e0 system()함수의 주소를 이용해 "/bin/sh"의 주소도 구해주자. #include int main() { int system = 0x40058ae0; while(memcmp((void*)system, "/bin/sh", 8)) system++; printf("%x\n", system); } "/bin/sh"의 주소를 구하..
GOT Overwrite GOT Overwrite는 Dynamic Link방식으로 컴파일된 바이너리가 공유 라이브러리를 호출할 때 사용되는 PLT & GOT를 이용하는 공격 기법이다. PTL는 GOT를 참조하고, GOT에는 함수의 실제 주소가 들어있는데, 이 GOT의 값을 원하는 함수의 실제 주소로 변조시킨다면, 원래의 함수가 아닌 변조한 함수가 호출된다. ex) printf("/bin/sh"); "/bin/sh"라는 문자열을 출력하는 함수가있으면 printf함수를 system함수로 변조하여 system("/bin/sh"); 가 되어 쉘을 실행시킨다. 예제 #include int main() { printf("/bin/sh"); } 예제 소스코드이다. 부분을 보면 printf함수의 PLT주소가 보인다. ..
RTL (Return-To-Libc) Return To Library 줄여서 RTL 기법이라고 한다. 쉘 코드없이 쉘을 실행할 수 있다. 메모리에 미리 적재되어 있는 공유 라이브러리 함수의 주소 RET에 덮어씌어 현재 코드에 사용되지 않는 함수를 실행 시킬 수 있다. RTL기법을 사용하는 대표적인 이유는 NX bit 방어기법을 우회하기 위해 사용한다. NX bit NX bit는 공격자가 스택, 힙, 데이터 영역에서의 공격코드를 실행하지 못하게 한다. 예제 argv[1][47]가 "\xbf"이면 프로그램을 종료를 시킨다. ret 변조시 bf로 시작하지 않는 주소로 변조시킬 수가 없기때문에 스택으로 주소를 변조하는 것은 불가능하다. RET를 공유 라이브러리 주소로 변조시켜 함수 내부 RET를 쉘을 실행시키는..
RTL기법을 이용한 문제이다. system()함수의 주소와 "/bin/sh"의 주소를 구해주자. system()함수의 주소는 0x40058ae0이다. "bin/sh"의 주소도 구해주자. #include int main() { int system = 0x40058ae0; while(memcmp((void*)system, "/bin/sh", 8)) system++; printf("%x\n", system); return 0; } 위의 소스코드를 작성해주고 실행해주자. "bin/sh"의 주소는 0x400fbff9이다. 페이로드는 (buffer + sfp) + system()주소 + dummy + "/bin/sh"주소 [44byte] [4byte] [4byte] [4byte] payload ./bugbear $..
problem_child함수가 argv[1]의 값을 받아와 버퍼에 복사하는데 buffer는 40인데 복사하는 값의 크기는 41이다. 1byte가 초과되어 SFP의 제일 마지막 1byte를 덮어 씌운다. 스택에서 SFP의 위 주소에는 RET가 존재한다. 즉, SFP + 4의 메모리는 다음 명령어의 실행 주소이다. gdb로 파일을열어 problem_child() 함수의 ret되기전 부분인 >problem_child+42>부분에 break point를 걸어주자. A로 41byte를 채우고 esp-8부터 40byte를 확인해 보자 0xbffffacc부터 "A"가 들어가고 41byte를 주어 SFP의 1byte를 0xbffffb41로 바꿔주었다. nop [15byte] + shellcode[25byte] + \x..
buffer와 buffer+48에서 0xbfffffff까지 모두 0으로 초기화 시킨다. LD_PRELOAD 환경변수를 이용하여 문제를 풀어야한다. printf()함수를 호출하면 libc를 참조하는게 아니라 LD_PRELOAD에 정의되어있는 라이브러리 내의 함수를 먼저 참조한다. 그리고 해당 함수가 존재하면 호출한다. #include int main() { return 0; } 빈 파일을 하나 만들어주자 쉘 코드 이름으로 컴파일을 해주었다. 쉘 코드 이름으로 컴파일 하고, 환경변수 LD_PRELOAD에 파일을 등록해주었다. gdb로 파일을 열고 main()함수가 끝나기전 부분에 break point를 걸어주었다. \xbf 조건을 맞춰주고 공유 라이브러리 영역은 스택 영역보다 낮은 주소에 위치하기 때문에 e..
#include #include #include #include #include struct auth { char name[32]; int auth; }; struct auth *auth; char *service; int main(int argc, char **argv) { char line[128]; while(1) { printf("[ auth = %p, service = %p ]\n", auth, service); if(fgets(line, sizeof(line), stdin) == NULL) break; if(strncmp(line, "auth ", 5) == 0) { auth = malloc(sizeof(auth)); memset(auth, 0, sizeof(auth)); if(strlen(l..
include #include #include #include #include struct internet { int priority; char *name; }; void winner() { printf("and we have a winner @ %d\n", time(NULL)); } int main(int argc, char **argv) { struct internet *i1, *i2, *i3; i1 = malloc(sizeof(struct internet)); i1->priority = 1; i1->name = malloc(8); i2 = malloc(sizeof(struct internet)); i2->priority = 2; i2->name = malloc(8); strcpy(i1->name, ..