목록전체 글 (67)
R4mbb

argv[0] 의 길이가 77이어야 한다. ./ 을 감안해 파일이름을 75길이로 만들자. 잘 되었다. gdb로 스택에 값이 어떻게 들어가는지 확인해보고 페이로드를 짜보자. 이전 문제와 거의 비슷해서 그냥 argv[1]에 쉘코드를 주입하고 argv[1]의 주소만 잘 찾으면 될 것 같다. 41 부분이 들어가있는 곳은 argv[0] 이고 그 다음 90오는 부분이 argv[1]이므로 저 주소로 잡고 페이로드를 보내보자. 잘 따졌다.

이전 문제들과 비슷하지만, 인자의 길이가 "\xbf" 검사한 뒤 더 이상 인자가 오면 안된다. 그렇다면 이런식으로 페이로드를 짤 수 있을 것 같다. dummy[19] + "shell"[25] + shell_addr[4] 여기서 이전과 달라진 점은 shell_addr에 들어가는 주소는 buffer의 주소가 아니다. 정확하게는 buffer에 복사되기전의 argv[1]의 인접 주소이다. 이렇게 된다면 buffer의 내부가 비워져도 argv[1]의 shellcode를 사용할 수 있게 된다. 페이로드를 짜보자. 빨간색 칸이 argv[1]의 주소이다. 최종 페이로드는 이렇게 된다. "\x90"*19 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x..

이전 문제와 유사하지만 마지막 부분에 memset함수가 버티고있다. 하지만 이전 문제에서 했던 방식대로면 이 문제로 똑같은 페이로드로 쉘이 따진다. 왜냐하면 buffer 내에 쉘코드를 저장하는 방식이 아니라 RET 뒤에 쉘코드를 저장하는 방식이라 문제에서 buffer의 메모리 값을 초기화 시켜도 아무런 문제가 없다. 이전 페이로드로 따보자.

문제풀다가 모르고 코드 파일을 삭제해버려서 다른 사람껄로 대체한다. 대충 프로그램 실행할 때 인자에서 48번째 문자가 \xbf 여야한다는 것 같다.] gdb로 뜯어보자. strcpy 쪽에 bp를 걸고 buffer와 ret 까지 확인할 수 있을 것이다. 하지만 "\xbf"를 우회해줘야 하기 때문에 문자 갯수를 맞춰서 넘겨주자. buffer = 0xbffffac0 ret = 0xbffffaec 페이로드는 우선 "A"*44 + shellcode_addr + NOP + "shell" 이렇게 할 것이다. 페이로드를 짜보자. "A"*44 + "\xf0\xfa\xff\xbf" + "\x90"*1000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x..

gets 에서 취약점이 터지는 것 같다. gdb로 까서 보자. 스택이 16byte만큼 확보가 되고, ebp-16 위치에 gets 함수로 입력을 받는다. ebp-16 주소와 ret 주소를 알아내 보자. 빨간색 칸은 buffer 주소가 되고, 노란색 칸은 ret 주소이다. 페이로드를 짜보자. "A"*20 + ebp+8 + "\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" 이렇게 보내면 될 것 같다. 와우~~

이 친구도 strcmp에서 취약점이 발생하는 것 같다. gdb로 까보자. main+53에 bp를 걸고 "A"를 16개 넣고 스택을 확인해보자. 25byte 쉘코드를 사용하려는데 buffer의 크기는 16byte밖에 되지 않는다. 오버플로우를 한 뒤 ebp~esp 밖에 shellcode를 저장하고, ret에 shellcode가 위치해 있는 주소값을 넣으면 될 것 같다. 해보쟝 먼저, 구해야 하는 것들을 구해보자. 1) buffer 주소 2) ret 주소 3) buffer에서 ret 사이의 거리 4) shellcode를 저장한 위치의 주소 --------------------------------------- 1) 0xbffffae8 2) 0xbffffaf8+0x4 = 0xbffffafc 3) 0xbffff..