소스코드가 기네요; 이번 문제는 연속 함수 호출 문제입니다. 그냥 계속 함수를 호출한 후 마지막 MO함수의 인자로 /bin/sh 문자열을 받으면 될 것 같다고 생각했습니다. 일단 gdb 에서 DO부터 MO까지의 함수의 주소를 알아냈습니다. 그리고 core파일을 만들기 위한 페이로드를 작성하였습니다. core파일을 뜨기위한 페이로드를 구성 할 때 AAAA+BBBB뒤에 /bin/sh 문자열이 왔으니 아마 스택에서도 그 뒤에 위치하지 않을까 하고 BBBB 4byte 뒤인 0xbffffa88주소를 확인해 보았습니다. 제 생각이 맞았습니다. /bin/sh 문자열은 0xbffffa88에 위치하네요. 그럼 이제 페이로드를 구성할 수 있습니다. A*44(sfp 까지 채우기 위한 쓰레기 값)+DO 함수 주소+GYE 함수..
이 문제는 Fake ebp 문제 입니다. http://bob3rdnewbie.tistory.com/187?category=699188 여기에 fake ebp 설명을 잘 하셨으니 참고 하시길 바랍니다. | buffer | sfp | ret | 여기 ret에 leave ret 가젯을 넣고 sfp를 buffer -4 의 주소로 변조한 다음 buffer에 shellcode의 주소를 넣어주면 될 것 같습니다. 일단 이렇게 코드를 짜서 core파일을 보겠습니다. 저기 buffer의 위치가 있군요 그러면 buffer -4 의 주소는 0xbfffd2bc입니다. 그럼 이제 shellcode의 위치를 찾아보면 nop을 10000개 준 위치 뒤에 있을 테니깐 nop주소 아무데나로 하겠습니다. 저는 0xbfffd4ac 로 주..
이번문제는 RTL기법도 사용하지 못합니다. 그렇다면 ret sled를 이용하여 공략하겠습니다. ret sled란 ret(return address)에 ret명령어를 덮어씌우는 방법입니다. ret 명령어의 주소입니다. core파일을 생성했습니다. 이제 코어파일을 분석해보겠습니다. 이 부분이 바로 우리가 ret 명령어 뒤에 적어줄 주소 중 하나겠네요. \x90*44+ret 명령어+ &nop+shellcode + nop+shellcode 이런식으로 공략하면 되겠습니다. 익스플로잇 성공했습니다.
이번 문제의 소스코드는 좀 기네요,, ret주소가 execve라는 함수의 주소와 같지 않으면 종료시켜버리기 때문에 execve함수를 이용해야겠습니다. 이전 문제에서 사용했던 RTL기법을 사용할건데요 ret에 공유라이브러리 주소를 넣는 대신에 execve함수의 주소를 넣어 우회하겠습니다. 그리고 execve의 함수의 ret에 system 함수의 주소를 넣고 그 인자로 /bin/sh 의 주소를 전달해 주는 형식으로 익스플로잇 하면 되겠습니다. 그럼 먼저 execve 함수의 주소와 system 함수의 주소를 알아보도록 하겠습니다. 그리고 /bin/sh 문자열의 주소를 구하는 소스코드를 작성해서 구해보았습니다. 소스코드는 저번 단계에서 system함수를 구했던 코드와 동일합니다. 그럼이제 익스플로잇 할 수 있겠..
지금까지 argv[1][47]이 '\xbf'이 아니면 프로그램을 종료했는데, 이번엔 '\xbf'이면 종료합니다. 코드를 우회하기 위해서 RTL이라는 기법을 사용하겠습니다. RTL이란 Retrun To Library의 약자로 libc(공유 라이브러리)로 리턴하라. 이런 뜻 인데요. ret 명령을 만나 libc로 리턴을 하게 프로그램 흐름을 조작해 준다. 이렇게 이해하면 될 것 같습니다. system()함수의 주소를 찾고, system()함수의 인자로 /bin/sh를 넘겨주면 될 것 같습니다. gdb로 bugbear를 디버깅 해보겠습니다. main함수에 bp를 걸고 실행을 시킨 후 system 함수를 print하였습니다. system함수의 주소는 0x40058ae0입니다. 위와같은 코드를 작성하였습니다. 이..
이번 문제는 FPO 문제입니다. 자 그럼 FPO(Frame Pointer Overflow)란 무엇이냐 하면 이전 함수의 ebp가 저장되어있는 sfp를 변조하여 프로그램을 원하는 흐름으로 돌리는 기법입니다. 함수 에필로그인 leave,ret 명령을 실행하면 이렇게 실행이 됩니다. 그런데 여기서 이전함수의 ebp를 담고있는 sfp를 변조한다면 pop ebp 부분에서 이전함수로 되돌아 가지 않고 변조된 주소로 ebp가 이동하겠죠. 그런데 만약 변조된 주소가 shellcode가 있는 영역이라면 익스플로잇을 할 수 있을 것 입니다. 저는 sfp를 &(buffer -4)로 변조하여 익스플로잇 하겠습니다. 이런식으로 구성하면 될 것 같습니다. gdb로 darkknight를 디버깅 한 후 bp를 problem_chil..
이번엔 buffer+48에서부터 0xbfffffff 까지의 주소를 모두 초기화 해버립니다. 지금까지 이용했던 argv,환경변수,buffer를 모두 사용하지 못합니다. 이번엔 LD_PRELOAD라는 환경변수를 이용하겠습니다. | Code | Data | Bss | Heap | Shared libc | buffer | sfp | ret | argv | env | LD_PRELOAD 환경변수는 buffer보다 낮은주소에 위치합니다 LD_PRELOAD라는 환경변수에 파일을 등록하면 프로그램이 실행될 때 메모리에 올라갑니다. 파일에 LD_PRELOAD 환경변수를 등록합니다. ' gcc 로 컴파일합니다. fPIC 옵션 - object파일을 동적라이브러리로 사용하도록 컴파일하는 옵션 shared 옵션 - 공유라이브러..
이번 문제는 argv를 모두 초기화 해버립니다. 일단 무작정 gdb로 skeleton을 디버깅 해 보았습니다. leave를 하기 전인 main+368에 breakpoint를 걸어줍니다. 메모리 주소를 보기위해 다음의 payload를 실행합니다. . esp부터 100만큼 메모리 주소를 보았다. argv를 다 0으로 초기화 하는데, 여기 0으로 초기화 되지 않은 부분이 아직 남아있습니다. x/100s 0xbfffffd8로 0xbfffffd8에서 100만큼 문자열로 보았더니 이런 경로가 뜨네요. 그럼 여기에 심볼릭 링크를 걸고, ret을 이곳의 주소로 변조하면 될 것 같습니다. 주소가 0xbffffc3인 이유는 /home/vampire/tmp/skeleton 이 문자의 크기가 26byte이고 심볼릭 링크의 앞..
이번엔 조금 특이한 조건이 붙었다. argv[1][46]의 값이 ff이면 안된다는 조건입니다. 즉, 우리가 지금까지 변조한 argv[2]의 주소가 0xbfff???? 이었다면 이번엔 0xbf?????? 이어야 한다는 것 입니다. 여기서 스택은 이렇게 구성 될 것 입니다. 여기서 argv[2]에 nop+shellcode를 넣어서 실행 할 것이기 때문에 argv[2]의 주소가 0xbffe????으로 시작하게 만들어 줄 것입니다. gdb로 vampire를 디버깅 해 보았습니다. strcpy 함수 실행 직후인 main+137에 breakpoint를 걸어주었습니다. argv[2]에 A를 65536개를 넣어주고 프로그램을 실행했습니다. 메모리를 확인해 보니 이렇게 구성되어있다. 그러면 이제 0xbffe로 시작하는 ..
orge.c의 코드 이다. argv의 갯수 제한이 있고, argv[1]과 buffer를 초기화합니다. 이 문제는 argv[0]에 쉘코드를 넣어주면 풀릴 것 같다고 생각했습니다. tmp로 troll을 복사해서 troll에 쉘코드와 약간의 NOP으로 구성된 심볼릭링크를 걸어줍니다. tmp에서 코어파일을 보기위해 페이로드를 작성해줍니다. 저렇게 페이로드를 작성했을 때 스택의 구조입니다. gdb로 코어파일을 분석하기 위해 디버깅합니다. argv[0]의 시작주소는 0xbffffa74입니다. 이제 임시디렉토리인 tmp 말고 orge에서 원본파일에 심볼릭 링크를 걸어보겠습니다. ret에 들어갈 주소를 argv[0]의 중간쯤으로 하고 페이로드를 작성하였더니 exploit 되었습니다. 원본파일에 페이로드를 작성했을 때의..